2013-08-19 22 views
0

我有一些代碼,我試圖找到一組數字。長度不一,我不希望他們在其他數字中被發現。例如下面的代碼:正確使用python中的 D?

reg="\D12345\D" 
string="12345" 
matchedResults = re.finditer(reg, string) 

for match in matchedResults: 
    print match.group(0) 

如果數字本身就不起作用。然而,如果我把這個將工作:

string="a12345" 

但這也將匹配a是不受歡迎的。有一個更好的方法嗎?

+0

給我們要匹配請 – pythonian29033

+1

@Jayram \ d和\ d是不同模式的字符串的幾個例子,所以它不能是重複 – pythonian29033

回答

1

使用零寬度負環視斷言:

reg = r"(?<!\d)12345(?!\d)" 

環視斷言(回顧後和先行)匹配位置,而不是一個字符;如果前面的文本或下面的文本分別與不匹配,否定否定斷言匹配命名模式匹配

這意味着只有位置做而不是按照或先於一個數字纔會匹配;字符串的開始和結束將爲此目的而做。

演示:

>>> import re 
>>> reg = re.compile(r"(?<!\d)12345(?!\d)") 
>>> reg.search('12345') 
<_sre.SRE_Match object at 0x102981ac0> 
>>> reg.search('-12345-') 
<_sre.SRE_Match object at 0x102a51238> 
>>> reg.search('') 
>>> reg.search('-') 
>>> reg.search('-123456') 
+0

我想過但如果數字之前有字符,我就不會得到一個匹配。例如,我希望它在沒有空格之前匹配an =。 編輯:編輯完成後,謝謝你。 – Martyn

+0

你能解釋(?<!\ d)中的每個元素究竟在做什麼嗎?將有助於我的理解和未來的使用。謝謝 – Martyn

+0

@Martyn:我試着回答。正則表達式中的每個'語句'或者匹配一個字符(字面或者模式),或者匹配一個位置(錨點,比如'^'和'$'和'\ b')。積極的lookaround斷言也匹配一個位置,但只有當它們包含的模式匹配* *之前的*或*位置後。 –