2012-11-29 6 views
2

파이썬에서 2 개의 단어 문자열을 모두 찾고 싶습니다. 내가이 만든 : 나는 점점 오전파이썬 정규 표현식 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' 등은 이러한 조합이 발생하지 않기 때문에 찾을 수 없습니다. 두 개의 임의 문자가 뒤따라 오는 공백 문자와 2 개의 임의 문자를 차례로 검색한다는 것을 기억하십시오. ['a1', 'a2', 'a3', 'a5', 'a6'] :

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 문자 조합을 찾기로

. 이들을 결합하면 가능한 모든 조합을 찾을 수 있습니다.

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

처음에는 모니터가 더러울 것으로 생각했습니다. 그 다음 나는 "캐릭터"의 h가 캐론을 가지고 있다는 것을 깨달았다. – NullUserException

+0

내가 찾으려면 a2-a3은 a1이없는 원래 문자열에서 다시 검색을 실행하는 것보다 더 좋은 방법이 있습니까? – nikosdi

+0

@ NullUserException 당신의 정규식에 대한 Thx; 'r'을 추가하여 원시 문자열로 만들었고 그 뒤에 공백을 찾지 못하도록'()'를 추가했습니다. 그리고 카론 힌트를위한 thx :-) – glglgl