正则表达式和 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.subcapturing 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),使正则表达式中的点也匹配换行符(换行符)。