2010-10-23 371 views
0

我正在逐行搜索一個文件,以查找## random_string ##的出現。它的工作原理除了多個#的情況下...Python正則表達式匹配:## ##

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

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

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

所需的輸出:

"lala #FOUND there" 

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

"lala FOUND there" 

那麼我怎麼會忽略任何數量的#開頭或結尾,只捕捉「## string ##」。

+0

請小心使用像'(。*?)'這樣的惰性量詞,因爲它會匹配'## abC#####'並捕獲'abC###'。還有懶惰的量詞很慢。 – glebm 2010-10-23 01:20:18

回答

3

要在兩端匹配至少兩個散列:

pattern='##+(.*?)##+' 
+0

即時對不起,我說我的問題很糟糕。我想匹配確切地 ## ##並忽略其他###在乞討或結束(即時調用re.sub,它會攪亂我的結果)。 – nubme 2010-10-23 01:38:52

+0

@nubme:我不確定你的意思。這正是我的答案。我只是測試它,並確認它輸出'hey',並且只有當字符串在每一端至少有兩個'#'字符時纔會匹配。 – 2010-10-23 01:43:32

+0

@marcelo:對不起,我編輯了我的問題,看看它現在是否更有意義。 – nubme 2010-10-23 01:49:30

1

'^#{2,}([^#]*)#{2,}' - 在任一端

任何數量的#> = 2小心使用懶惰量詞等,因爲它會匹配 '## ABC#####' 和捕獲(*?) 'ABC###'。也懶的量詞是非常慢的

+0

我認爲他在開始*和*結束時至少需要2個。 – 2010-10-23 01:21:51

+0

編輯,謝謝 – glebm 2010-10-23 01:22:57

0

嘗試「塊註釋絕招」:/##((?:[^#]|#[^#])+?)##/ Screenshot of working example

0

添加+到正則表達式,這意味着匹配一個或多個字符。

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

string='###HEY##' 
result=prog.search(string) 
print result.group(1) 

輸出:

HEY 
0

你有沒有考慮做非正則表達式的方式?

>>> string='lala ####hey## there' 
>>> string.split("####")[1].split("#")[0] 
'hey' 
3

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

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

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

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

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

編輯:如果您不希望允許空白內部文本(即「####」不應該的「」內文匹配),然後將其更改爲:

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

+表示「一個或多個」。

0
>>> import re 
>>> text= 'lala ###hey## there' 
>>> matcher= re.compile(r"##[^#]+##") 
>>> print matcher.sub("FOUND", text) 
lala #FOUND there 
>>>