[python] re 모듈의 정규식이 단어 경계 (\ b)를 지원합니까?

정규식에 대해 조금 더 배우려고하는 동안 튜토리얼에서 \b를 사용하여 단어 경계를 일치 시킬 수 있다고 제안했습니다 . 그러나 Python 인터프리터의 다음 스 니펫은 예상대로 작동하지 않습니다.

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

일치하는 항목이 있으면 일치 개체 여야하지만 None.

는 IS \b표현은 파이썬에서 지원되지 또는 내가 잘못을 사용하고?



답변

시도해 보지 그래

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

산출:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

또한 언급하는 것을 잊었습니다. 코드에서 원시 문자열사용해야합니다.

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 


답변

이것은 작동합니다. re.search(r"\btwo\b", x)

"\b"Python으로 작성할 때는 단일 문자 "\x08"입니다.. 다음과 같이 백 슬래시를 이스케이프하십시오.

"\\b"

또는 다음과 같이 원시 문자열을 작성하십시오.

r"\b"


답변

작동하지 않는 이유 를 명시 적으로 설명 re.search("\btwo\b", x)하기 \b위해 Python 문자열에서 백 스페이스 문자의 속기 이기 때문 입니다.

print("foo\bbar")
fobar

따라서 패턴 "\btwo\b"은 백 스페이스를 찾고 two, 뒤에, 다른 백 스페이스가 뒤 따릅니다 x = 'one two three'. ( ) 에서 검색하는 문자열 에는 없습니다.

시퀀스 를 단어 경계로 해석 하도록 re.search(또는 compile) 허용하려면 \b백 슬래시 ( "\\btwo\\b")를 이스케이프 하거나 원시 문자열을 사용하여 패턴을 만듭니다 ( r"\btwo\b").


답변

Python 문서

https://docs.python.org/2/library/re.html#regular-expression-syntax

\비

빈 문자열과 일치하지만 단어의 시작 또는 끝에서만 일치합니다. 단어는 일련의 영숫자 또는 밑줄 문자로 정의되므로 단어의 끝은 공백 또는 영숫자가 아닌 밑줄이 아닌 문자로 표시됩니다. 공식적으로 \ b는 \ w와 \ W 문자 사이 (또는 그 반대) 또는 \ w와 문자열의 시작 / 끝 사이의 경계로 정의되므로 영숫자로 간주되는 정확한 문자 집합은 UNICODE 및 LOCALE 플래그의 값. 예를 들어, r ‘\ bfoo \ b’는 ‘foo’, ‘foo.’, ‘(foo)’, ‘bar foo baz’와 일치하지만 ‘foobar’또는 ‘foo3’과는 일치하지 않습니다. 문자 범위 내에서 \ b는 파이썬의 문자열 리터럴과의 호환성을 위해 백 스페이스 문자를 나타냅니다.


답변