2012-11-29 79 views
2

我想在Python中找到所有2個字符串。 我創造了這個:Python的正則表達式findall

#!/usr/bin/python 
import re 

string='a1 a2 a3 a5 a6' 
search=re.findall('.. ..',string) 
print len(search) 
for nk in search: 
     print nk 

我越來越: A1 + A2 A3 A5 雖然我想:A1 + A2,A2 A3,A3 A5,...等 的的findall應該尋找所有可能的模式? 爲什麼會返回a1 a2,a3 a5? 謝謝。

回答

2

它返回['a1 a2', 'a3 a5'],因爲這些是唯一可以找到的模式:應用第一個模式後,'a1 a2'部分消失,' a3 a5 a6'剩下。下一個可能的模式是'a3 a5',並且' a6'已遺留,無法進一步匹配。

'a1 a3','a1 a5'等無法找到,因爲這種組合不會發生。請記住,您搜索兩個任意字符,後跟一個空格字符,後跟兩個任意字符。

隨着

r=re.compile(r"(\S{2})(?:\s|$)") 
pairs =r.findall("a1 a2 a3 a5 a6") 

pairs = re.findall(r"(\S{2})(?:\s|$)", "a1 a2 a3 a5 a6") 

你會發現所有的2字符組合,這些枯萎後面加一個空格或字符串的結尾:['a1', 'a2', 'a3', 'a5', 'a6']。如果結合這些,你會發現所有可能的組合:

for ifirst in range(len(pairs) - 1): 
    for second in pairs[ifirst + 1:]: 
     print " ".join((pairs[ifirst], second)) 
+1

起初,我以爲我的顯示器很髒。然後我意識到「角色」中的h有一個caron。 – NullUserException

+0

如果我想查找和a2-a3有沒有更好的方法比在沒有a1的原始字符串上再次運行搜索? – nikosdi

+0

@NullUserException Thx爲您的正則表達式;我添加了一個'r'使它成爲一個原始字符串,並且我添加了'()',以便在它們後面找不到空格。和thx的caron提示:-) – glglgl