2016-09-13 5 views
3

정규식을 사용하여 'my car'문자열을 찾고 그 전에 4 단어까지 검색합니다. 내 참조 텍스트는 다음과 같습니다Python 3 정규식 단어 경계가 분명하지 않습니다.

my house is painted white, my car is red. 
A horse is galloping very fast in the road, I drive my car slowly. 

내가 정규식 사용하는 경우 :

re.finditer(r'(?:\w+[ \t,]+){0,4}my car',txt,re.IGNORECASE|re.MULTILINE) 

나는 예를 results.For 예상 점점 오전 : 집에 흰색 페인트되어, 내 차

나는를 사용하는 경우 정규식 : 만 얻고

re.finditer(r'(?:\w+\b){0,4}my car',txt,re.IGNORECASE|re.MULTILINE) 

: '내 차'와 '내 차' , 난 점점 아니에요 그 전에 네 단어까지. \ b를 사용하여 {0,4} 그룹의 단어와 일치시킬 수없는 이유는 무엇입니까?

+3

'\의 b'는이 단어 후 등 공간/쉼표를 일치하지 않습니다 제로 폭 주장이다. – anubhava

+0

단어 경계에 대한 정규 표현식은'(? :(? :^| (? <= [^ a-zA-Z0-9 _])) (? = [a-zA-Z0-9 _]) | (? = $ a-zA-Z0-9 _]))) 아마도 당신이 만든 실수를 발견 할 수 있습니다. – sln

답변

2

\b는 단어 문자와 비 단어 사이 아닌 단어 문자와 단어의 문자 간의 문자열의 시작과 워드 문자 사이 위치 일치하는 제로 폭 주장word boundary 때문에 char와 단어 char와 문자열의 끝 사이. 의 텍스트을 소비하지 않습니다.

my car 전에 단어 경계가 뒤 따르는 1+ 단어 chasrs가 없기 때문에 (?:\w+\b){0,4}은 빈 문자열과 일치합니다.

(?:\w+\W+){0,4}my car\b 

이 (가) regex demo

+0

확실하게,'carriage '다음에 단어 경계 *를 사용하여'carriage '과 일치하지 않게 할 수 있습니다. –

2

당신은 사용할 수 있습니다 : 참조 :

(?:\b\w+\W+){4} 
\b(?:my\ car)\b 

대신 단어 경계를 모방 효과적으로 것이다 1+ 단어가 아닌 문자와 일치 할 수 있습니다 a demo on regex101.com을 참조하십시오. Python에서


이 될 것입니다 :

import re 

rx = re.compile(r''' 
       (?:\b\w+\W+){0,4} 
       \b(?:my\ car)\b 
       ''', re.VERBOSE) 

string = """ 
my house is painted white, my car is red. 
A horse is galloping very fast in the road, I drive my car slowly. 
""" 
words = rx.findall(string) 
print(words) 
# ['house is painted white, my car', 'the road, I drive my car'] 
+2

'\ w'와'\ W' 사이에 단어의 경계를 놓치지 않아야하므로'\ w + \ b \ W +'내부의'\ b'가 중복됩니다. –

+0

예, 정의에 따르면'(? <= \ W) (? = \ w)'는 한 단어 경계입니다. 따라서 {(? : \ b \ w + \ W +) {0,4}'는 전체 \ {\ b \ w \ \ W + \ b \ w + \ W + \ b \ w + \ W + 4}. 그러면'\ W + \ b \ w +'는'\ W + \ w +'와 동일하다. – sln

관련 문제