2015-02-10 95 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