正则表达式和 python:在 TeX 文档中用 \[ 和 \] 替换 $$
Regex and python: substituting $$ with \[ and \] in a TeX document
编辑:
带有测试、示例和解决方案的正则表达式:https://www.regex101.com/r/rY7uI4/2
我正在尝试转换 TeX 内容(我们假设它包含在变量 foo
中),以便将分隔符 $$
转换为标准 TeX \[
和 \]
。我一直在玩 regex101 但直到现在都没有运气。
理想情况下,预期结果是给定此输入:
text
$$ math $$
$$
math
$$
text $$math$$ text
输出如下
text
\[ math \]
\[
math
\]
text \[math\] text
也许正则表达式不是最好的工具,但我发现没有其他工具可以完成这项任务。感谢您的帮助!
编辑:
添加更复杂(更现实)的测试用例:
$$\alpha \quad \beta \quad \varepsilon \quad \varphi \quad \mathbb{R} \quad \mathcal{C}([0,1]) \quad \mathfrak{R}([0,2\pi]) \quad \mathscr{C}(\mathbb{R})$$
$$\vec{x} \in \mathbb{R}^n, \quad \underline{x}\in \mathbb{R}^m, \quad \mathbf{x}\in \mathbb{R}^m $$$string
应该导致:
\[\alpha \quad \beta \quad \varepsilon \quad \varphi \quad \mathbb{R} \quad \mathcal{C}([0,1]) \quad \mathfrak{R}([0,2\pi]) \quad \mathscr{C}(\mathbb{R})\]
\[\vec{x} \in \mathbb{R}^n, \quad \underline{x}\in \mathbb{R}^m, \quad \mathbf{x}\in \mathbb{R}^m $\]string
注意第二个字符串末尾出现转义的 $。
您可以将 re.sub
与 capturing groups 一起使用,如下所示:
>>> import re
>>> s="""text
... $$ math $$
...
... $$
... math
... $$
...
... text $$math$$ text"""
>>> print re.sub(r'$$\s?(\w+)\s?$$',r'\[\]',s)
text
\[math\]
\[math\]
text \[math\] text
在这种情况下,</code> 是您的正则表达式模式中匹配的第一个组 <code>(\w+)
编辑:因为如果您在编辑中添加 $$
之间可能有更多文本,您只需要更改 \w
匹配单词字符 .+
以匹配任何字符长度大于 1.
>>>re.sub(r'${2,}\s?(.+?)\s?${2,}',r'[]',s)
使用非贪婪正则表达式。
print re.sub(r'$$(.*?)$$',r'\[\]',s)
如果您不想考虑转义的美元符号,请使用负向后视来检查最后一个 $$
前面是否没有反斜杠字符。
print re.sub(r'(?s)(?<!\)$$(.*?)(?<!\)$$',r'\[\]',s)
在开头添加 DOTALL 修饰符 (?s)
,使正则表达式中的点也匹配换行符(换行符)。
编辑: 带有测试、示例和解决方案的正则表达式:https://www.regex101.com/r/rY7uI4/2
我正在尝试转换 TeX 内容(我们假设它包含在变量 foo
中),以便将分隔符 $$
转换为标准 TeX \[
和 \]
。我一直在玩 regex101 但直到现在都没有运气。
理想情况下,预期结果是给定此输入:
text
$$ math $$
$$
math
$$
text $$math$$ text
输出如下
text
\[ math \]
\[
math
\]
text \[math\] text
也许正则表达式不是最好的工具,但我发现没有其他工具可以完成这项任务。感谢您的帮助!
编辑: 添加更复杂(更现实)的测试用例:
$$\alpha \quad \beta \quad \varepsilon \quad \varphi \quad \mathbb{R} \quad \mathcal{C}([0,1]) \quad \mathfrak{R}([0,2\pi]) \quad \mathscr{C}(\mathbb{R})$$
$$\vec{x} \in \mathbb{R}^n, \quad \underline{x}\in \mathbb{R}^m, \quad \mathbf{x}\in \mathbb{R}^m $$$string
应该导致:
\[\alpha \quad \beta \quad \varepsilon \quad \varphi \quad \mathbb{R} \quad \mathcal{C}([0,1]) \quad \mathfrak{R}([0,2\pi]) \quad \mathscr{C}(\mathbb{R})\]
\[\vec{x} \in \mathbb{R}^n, \quad \underline{x}\in \mathbb{R}^m, \quad \mathbf{x}\in \mathbb{R}^m $\]string
注意第二个字符串末尾出现转义的 $。
您可以将 re.sub
与 capturing groups 一起使用,如下所示:
>>> import re
>>> s="""text
... $$ math $$
...
... $$
... math
... $$
...
... text $$math$$ text"""
>>> print re.sub(r'$$\s?(\w+)\s?$$',r'\[\]',s)
text
\[math\]
\[math\]
text \[math\] text
在这种情况下,</code> 是您的正则表达式模式中匹配的第一个组 <code>(\w+)
编辑:因为如果您在编辑中添加 $$
之间可能有更多文本,您只需要更改 \w
匹配单词字符 .+
以匹配任何字符长度大于 1.
>>>re.sub(r'${2,}\s?(.+?)\s?${2,}',r'[]',s)
使用非贪婪正则表达式。
print re.sub(r'$$(.*?)$$',r'\[\]',s)
如果您不想考虑转义的美元符号,请使用负向后视来检查最后一个 $$
前面是否没有反斜杠字符。
print re.sub(r'(?s)(?<!\)$$(.*?)(?<!\)$$',r'\[\]',s)
在开头添加 DOTALL 修饰符 (?s)
,使正则表达式中的点也匹配换行符(换行符)。