2015-02-10 59 views
1

我想提取一个文件$$之间的所有乳胶表达式,即字符串不属于\$\$probem与蟒蛇正则表达式涉及反斜线

之间考虑followingg:

import re 
with open("abstracts.txt","r",encoding="utf-8") as f: 
    l = f.read() 

with open("latex.txt","w",encoding="utf-8") as f: 
    for a in re.findall(r"[^\\]\$.*?[^\\]\$",l,re.S): 
     f.write(a+"\n") 

这按我的需要工作,但它包含美元符号。但是,当我更改(*)到

for a in re.findall(r"[^\\]\$(.*?)[^\\]\$",l,re.S): #(*) 

它不会做我想要的。例如字符串$\overline{\tilde \ch_0}$转换为\overline{\tilde \ch_0

任何想法我做错了什么?

+0

“哪些不在\ $和\ $”部分表示什么?我没有看到它在你的代码中的任何地方被解决。 – 2015-02-10 20:50:17

+1

请注意,为正则表达式使用[原始字符串文字](https://docs.python.org/2/reference/lexical_analysis.html?highlight=literal#string-literals)以避免混淆。例如。在'\ $'中,反斜杠在Python级别上未转义。 – 2015-02-10 20:51:58

+0

@ivan_pozdeev:我已经在OP的代码中自由地做到了这一点,以便于阅读。 – Kevin 2015-02-10 21:06:09

回答

2

你的正则表达式匹配美元符号前的字符。我会推荐使用负向反向代替:

for a in re.findall(r"(?<!\\)\$(.*?)(?<!\\)\$",l,re.S): 
+0

谢谢。我不知道负面的后视技术,这在这里确实很自然。 – 2015-02-10 20:59:19