如何使用正则表达式删除乳胶文件中的所有数学表达式

时间:2019-02-13 06:28:53

标签: python regex latex

假设我有一个包含一部分乳胶文件的字符串。如何使用python re模块删除其中的任何数学表达式?

例如:

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 ..."

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试此正则表达式:

(\$+)(?:(?!\1)[\s\S])*\1

Click for Demo

Code

说明:

  • (\$+)-匹配1次以上的$并将其捕获到第1组
  • (?:(?!\1)[\s\S])*-匹配0+次出现的,并非以第1组中捕获的字符开头的任何字符
  • \1-再次匹配组1的内容

将每个匹配项替换为空白字符串。

如@torek所建议,我们不应该匹配3个或更多连续的$,因此将表达式更改为(\${1,2})(?:(?!\1)[\s\S])*\1

答案 1 :(得分:1)

通常说正则表达式不能计数,这是一种松散的描述问题的方式,该问题在Count parentheses with regular expression中进行了更为正式的讨论。看看这意味着什么。

现在,请记住,请注意LaTeX数学表达式可以包含嵌套的子方程式,该子方程式可以包含其他嵌套的子方程式,依此类推。这类似于检测闭合括号是关闭内部括号表达式(例如(例如,在本示例中,第一个没有)还是外部括号)的问题。因此,正则表达式的功能不足以处理完整的一般情况。

如果您愿意做的工作还不完整,您可以 构造一个查找$...$$$...$$的正则表达式。您将需要注意可用的特定正则表达式语言。 Python的本质与此处的Perl相同。

重要的是,这些$匹配器将完全错过\begin{equation} ... \end{equation}\begin{eqnarray} ... \end{eqnarray},依此类推。我们已经注意到,仅使用正则表达式识别器来处理LaTeX表达式解析是不够的,因此,如果您想做得很好,而忽略了令牌类型的低级TeX操纵的复杂性,则可以更改任何单个字符的category code -您将需要一个更通用的解析器。然后,您可以标记\begin{}和单词,并匹配开始/结束对。您还可以标记$$$并进行匹配。由于解析器可以进行计数,因此正则表达式无法完全计数,因此您可以通过这种方式做得更好。