2010-10-23 170 views
0

可能重複:
Python Regular Expression Matching: ## ##Python的正則表達式匹配## ##

我已經問過這個問題,但讓我更好地再說一遍...林通過搜索文件中的行用於出現## random_string ##的行。它的工作原理除了多個#的情況下...

pattern='##(.*?)##' 
prog=re.compile(pattern) 

string='lala ###hey## there' 
result=prog.search(string) 

print re.sub(result.group(1), 'FOUND', line) 

所需的輸出:

"lala #FOUND there" 

相反,我得到下面的,因爲它抓住了整個###哎##:

"lala FOUND there" 

那麼我怎麼會忽略任何數量的#在乞討或結束,只捕獲「##字符串##」。

+1

編輯現有的問題;不要發佈一個新的副本來澄清。可能的[Python正則表達式匹配:## ##]重複(http://stackoverflow.com/questions/4001980/python-regular-expression-matching) – geoffspear 2010-10-23 02:24:49

+0

我做了,但人們停止對那一個響應(認爲它是太老) – nubme 2010-10-23 02:26:37

+1

太舊了?它不到一個小時的時間...有一些耐心 – Wolph 2010-10-23 02:29:54

回答

1

你的問題是與你的內心的匹配。您使用.,它與任何字符不匹配,並且這意味着它也匹配#。所以當它得到###hey##時,它匹配(.*?)#hey

簡單的解決方法是從可匹配集排除#字符:

prog = re.compile(r'##([^#]*)##') 

普羅蒂普:對正則表達式使用原始字符串(例如r''),所以你不必用反斜槓發瘋。

試圖允許#內部的哈希將使事情更復雜。

(編輯:早期版本沒有處理前/後###右)

+0

謝謝,但它不工作的字符串#### hey ## =(lol – nubme 2010-10-23 04:15:06

+0

移動我的答案到你原來的問題,看看 – 2010-10-23 12:40:50

0
>>> s='lala ###hey## there' 
>>> re.sub("(##[^#]+?)#+","FOUND",s) 
'lala #FOUND there' 

>>> s='lala ###hey## there blah ###### hey there again ##' 
>>> re.sub("(##[^#]+?)#+","FOUND",s) 
'lala #FOUND there blah ####FOUND' 
0
import re 

pattern = "(##([^#]*)##)" 
prog = re.compile(pattern) 

str = "lala ###hey## there" 
result = prog.search(string) 

line = "lala ###hey## there" 

print re.sub(result.group(0), "FOUND", line) 

訣竅是說(不是#),而不是任何東西。這還假定

line = "lala #### there" 

結果:

line = "lala FOUND there" 
+0

你不需要把parens圍繞整個模式;匹配組0是整個匹配的輸入文本。 – 2010-10-23 02:47:55