假设我有一个包含一部分乳胶文件的字符串。如何使用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 ..."
。
谢谢!
答案 0 :(得分:1)
尝试此正则表达式:
(\$+)(?:(?!\1)[\s\S])*\1
说明:
(\$+)
-匹配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
,{
,}
和单词,并匹配开始/结束对。您还可以标记$
和$$
并进行匹配。由于解析器可以进行计数,因此正则表达式无法完全计数,因此您可以通过这种方式做得更好。