2014-03-25 3 views
2

문자열에 두 번 나타나는 모든 대문자 단어 (또는 그 일부)의 위치를 ​​찾는 방법을 찾고 있습니다. - 예 굵은 위치에서 내가 감지 할 :문자열의 정규식 단어

  • 00004 ADC 어떤 임의의 단어 ADC 다른 관련이없는 문자 다른 관련이없는 200
  • 399 ADC0 플래그를 CAN
  • 02 일부 CANIT을 ADC0 더 많은 단어 adc

내가 가지고있는 (그리고 온라인 정규식 파서에서 작동하는 것 같다)

p = re.compile('([A-Z]{2,}[A-Z0-9]*).*(\1)') 
match = p.search('0x0000 ADC asdf ADC') 
print(match) 

공백 등 다양한 변형을 시도했지만 일치하는 경우 Nonetype을 생성했습니다. 어떤 힌트가이 정규식에서 잘못 되었습니까?

답변

2

정규식 패턴을 정의 할 때 원시 문자열을 사용하십시오. 귀하의 경우에는 (두 번째와 세 번째 단락에서 discussion of this issueraw string notation의 설명 참조), '\1'는 단일 문자 chr(1)으로 해석지고 :

반면
In [173]: '\1' 
Out[173]: '\x01' 

In [181]: list('\1') 
Out[181]: ['\x01'] 

, 당신은 두 개의 문자를 원하는, 백 슬래시는 다음에 1 : 당신이 많은 등의 패턴을 발견하고자하는 경우, 다음이 아닌 욕심 .*? 대신 .*의를 사용할 수 있음을

In [180]: list(r'\1') 
Out[180]: ['\\', '1'] 

In [176]: p = re.compile(r'([A-Z]{2,}[A-Z0-9]*).*(\1)') 

In [177]: p.search('0x0000 ADC asdf ADC') 
Out[177]: <_sre.SRE_Match at 0xb439770> 

참고 :

In [195]: [(match.start(), match.end()) for match in re.finditer(r'\b([A-Z]{2,}[A-Z0-9]*).*?(\1)', '0x0000 ADC asdf ADC0 ADC ADC0')] 
Out[195]: [(7, 19), (21, 28)] 
+0

오 .... 어떤 명백한 실수. 고마워. – user1176976

1

\\1하지 \1

p = re.compile('([A-Z]{2,}[A-Z0-9]*).*(\\1)')