2011-11-25 5 views
1

파이썬 정규 표현식을 사용하여 문자열에서 파이프 문자를 일치 시키려고합니다. 일치시킬 수 없습니다. 나는 그것을 단순화 된 버전으로 끓여 냈다.문자열 중간에 파이프 문자를 파이썬 정규 표현식과 일치 시키십시오.

문자열에서 z|a 시퀀스를 찾고 있다고 가정 해 봅시다.

>>> import re 
>>> re.match(r'|', 'xyz|abc') 
<_sre.SRE_Match object at 0x2d9a850> 
>>> re.match(r'z|', 'xyz|abc') 
<_sre.SRE_Match object at 0x2d9a780> 
>>> re.match(r'|a', 'xyz|abc') 
<_sre.SRE_Match object at 0x2d9a850> 
>>> re.match(r'z|a', 'xyz|abc') 
>>> re.match(r'z\|a', 'xyz|abc') 
>>> re.match(r'z\\|a', 'xyz|abc') 
>>> re.match(r'z\\\|a', 'xyz|abc') 
>>> re.match(r'z[|]a', 'xyz|abc') 
>>> 

그래서 내가 |, |az|와 일치 할 수 있지만 내가 z|a 일치 할 수있는 방법을 찾을 수 있습니다 여기에 몇 가지 가능한 정규 표현식에 결과입니다. 어떤 아이디어?

+0

싱글 대신 큰 따옴표를 사용하면 작동하지 않습니까? –

답변

4

re.match()는 문자열 시작 부분에서 일치하는 문자열을 찾습니다. 대신 re.search()을 사용하십시오.

일치하는 패턴은 빈 문자열과 일치합니다. 즉 r '|' 빈 문자열 또는 빈 문자열, r'z | ' 는 z 또는 빈 문자열이고 '| a'는 빈 문자열 또는 a입니다. 그것들 모두는 어떤 문자열에도 일치합니다.

>>> re.match('z\\|a', 'xyz|abc') 
>>> re.search('z\\|a', 'xyz|abc') 
<_sre.SRE_Match object at 0x02BF2BB8> 
>>> re.search(r'z\|a', 'xyz|abc') 
<_sre.SRE_Match object at 0x02BF2BF0> 

더 일반적으로 당신은 당신이 일을 언 이스케이프 할 필요가 얼마나 많은 백 슬래시를 파악하는 것을 피하기 위해 더 복잡한 정규 표현식의 중간에 포함 할 필요가 리터럴 문자열에 re.escape()를 사용할 수 있습니다.

+0

아, 감사합니다. 성냥/검색 문제를 직접 알아야합니다. 그리고 re.escape()에 보너스 포인트 (만약 내가 줄 수 있다면) –

0

re.match을 문자열 중간에 일치 시키려면 다음 방법을 사용할 수 있습니다.

myPattern = "how" 

re.match('(.)*(%s)' %myPattern, 'Hello, how are you ?')* 

.은 정규식의 모든 것과 일치합니다. 기본적으로 패턴 일치에 필요한 문자를 건너 뛰기 위해 일치를 요청합니다.

관련 문제