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


100

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

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

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

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


31
작동합니다 :re.search(r"\btwo\b", x)
Bolo

5
"원시"문자열을 사용하지 않는 이유는 무엇입니까? r"\btwo\b"?
S.Lott

3
사람들은 종종 에 대해 혼란스러워\b 합니다.
tchrist

예, 파이썬은 그렇습니다r'\b' . 문자가 이스케이프되도록 원시 문자열 이 필요합니다 . (또는 \\byukky 인 이중 탈출 )
smci

답변:


85

시도해 보지 그래

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>
>>> 

흥미 롭습니다. 작업 예제에 감사드립니다. 내가 선택한 방법이 작동하지 않는 이유에 대한 통찰력이 있습니까? 두 가지 접근 방식은 동일해야하지만 접근 방식에서는 한 번만 컴파일하는 것입니다.
DC

1
@darren : 당신이 한 일을 향상시키는 마지막 예를 참조하십시오. 검색 할 원시 문자열을 제공했습니다.
pyfunc

1
당신과 Bolo의 제안에 따라, 그것은 내가 원시 문자열을 사용하지 않았기 때문입니다. 감사!
DC

9
-1 : 거꾸로. 원시 문자열이 첫 번째 여야합니다. 문자열 %대체를 사용 하여 re 표현식을 작성하는 다른 비즈니스는 이 특정 질문과 관련이없는 잘못된 접선입니다.
S.Lott

2
잘못된 대답입니다. 코드는 작동하지만 설명이 전혀 없습니다.
Aran-Fey

88

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

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

"\\b"

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

r"\b"

4
이것은 정말 저를 도왔습니다 ... 저는 pyspark rlike 정규 표현식으로 고심하고 있었고 \ b (단어 경계)가 작동하지 않는 이유를 파악할 수 없었습니다. 감사합니다
jb1t

17

작동하지 않는 이유 를 명시 적으로 설명 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").


10

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는 파이썬의 문자열 리터럴과의 호환성을 위해 백 스페이스 문자를 나타냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.