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

问题描述 投票:0回答:2

假设我有一个由乳胶文件的一部分组成的字符串。如何使用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 ..."

谢谢!

python regex latex
2个回答
1
投票

试试这个正则表达式:

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

Click for Demo

Code

说明:

  • (\$+) - 匹配1次出现的$并在第1组中捕获它
  • (?:(?!\1)[\s\S])* - 匹配任何不以第1组中捕获的内容开头的0+次出现
  • \1 - 再次匹配第1组的内容

用空字符串替换每个匹配项。

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


1
投票

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

现在,考虑到这一点,请注意,LaTeX数学表达式可以包含嵌套的子方程,其中可以包含更多嵌套的子方程,等等。这类似于检测右括号是否关闭内括号表达式的问题(如(例如)本例中第一个没有)或外括号。因此,正则表达式不足以处理完整的一般情况。

如果你愿意做一个不完整的工作,你可以构建一个找到$...$$$...$$的正则表达式。您需要注意可用的特定正则表达式语言。 Python与Perl在这里基本相同。

重要的是,这些$-matchers将完全错过\begin{equation} ... \end{equation}\begin{eqnarray} ... \end{eqnarray}等。我们已经注意到仅使用正则表达式识别器处理LaTeX表达式解析是不够的,所以如果你想做好工作 - 同时忽略令牌类型的低级TeX操作的复杂性,可以改变任何单个字符的category code -你会想要一个更通用的解析器。然后,您可以对\begin{}和单词进行标记,并匹配开始/结束对。您还可以对$$$进行标记,然后将它们匹配起来。由于解析器可以计算,正如正则表达式所不能的那样,您可以通过这种方式做得更好。

© www.soinside.com 2019 - 2024. All rights reserved.