假设我有一个由乳胶文件的一部分组成的字符串。如何使用python re模块删除其中的任何数学表达式?
e.g:
text="This is an example $$a \text{$a$}$$. How to remove it? Another random math expression $\mathbb{R}$..."
我希望我的功能返回ans="This is an example . How to remove it? Another random math expression ..."
。
谢谢!
试试这个正则表达式:
(\$+)(?:(?!\1)[\s\S])*\1
说明:
(\$+)
- 匹配1次出现的$
并在第1组中捕获它(?:(?!\1)[\s\S])*
- 匹配任何不以第1组中捕获的内容开头的0+次出现\1
- 再次匹配第1组的内容用空字符串替换每个匹配项。
正如@torek所建议的,我们不应该匹配3个或更多连续的$
,因此将表达式更改为(\${1,2})(?:(?!\1)[\s\S])*\1
通常说正则表达式不能计算,这是一种描述在Count parentheses with regular expression中更正式讨论的问题的松散方式。看看这意味着什么。
现在,考虑到这一点,请注意,LaTeX数学表达式可以包含嵌套的子方程,其中可以包含更多嵌套的子方程,等等。这类似于检测右括号是否关闭内括号表达式的问题(如(例如)本例中第一个没有)或外括号。因此,正则表达式不足以处理完整的一般情况。
如果你愿意做一个不完整的工作,你可以构建一个找到$...$
和$$...$$
的正则表达式。您需要注意可用的特定正则表达式语言。 Python与Perl在这里基本相同。
重要的是,这些$
-matchers将完全错过\begin{equation} ... \end{equation}
,\begin{eqnarray} ... \end{eqnarray}
等。我们已经注意到仅使用正则表达式识别器处理LaTeX表达式解析是不够的,所以如果你想做好工作 - 同时忽略令牌类型的低级TeX操作的复杂性,可以改变任何单个字符的category code -你会想要一个更通用的解析器。然后,您可以对\begin
,{
,}
和单词进行标记,并匹配开始/结束对。您还可以对$
和$$
进行标记,然后将它们匹配起来。由于解析器可以计算,正如正则表达式所不能的那样,您可以通过这种方式做得更好。