파이썬에서 정규식 문자열 이스케이프


229

일부 텍스트를 검색하기 위해 사용자의 입력을 정규식 패턴으로 사용하고 싶습니다. 작동하지만 사용자가 정규식에 의미가있는 문자를 넣는 경우를 어떻게 처리 할 수 ​​있습니까? 예를 들어, 사용자는 Word를 검색하려고합니다 (s). 정규식 엔진이 (s)그룹을 사용합니다. 문자열처럼 취급하고 싶습니다 "(s)". 나는 실행할 수있는 replace사용자 입력과 교체 (\()함께 \)하지만 문제는 모든 가능한 정규식 기호를 위해 교체해야 할 것입니다. 더 나은 방법을 알고 있습니까?

답변:


324

re.escape()기능을 사용하십시오 .

4.2.3 re모듈 내용

탈출 (문자열)

영숫자가 아닌 모든 문자가 백 슬래시 인 문자열을 반환합니다. 정규 표현식 메타 문자가있는 임의의 리터럴 문자열을 일치시키려는 경우에 유용합니다.

간단한 예를 들어, 제공된 문자열의 발생을 선택적으로 선택적으로 's'다음에 검색하고 일치 오브젝트를 리턴합니다.

def simplistic_plural(word, text):
    word_or_plural = re.escape(word) + 's?'
    return re.match(word_or_plural, text)

53

re.escape () 사용할 수 있습니다 :

re.escape (string) 영숫자가 아닌 모든 문자가 백 슬래시 인 문자열을 반환합니다. 정규 표현식 메타 문자가있는 임의의 리터럴 문자열을 일치시키려는 경우에 유용합니다.

>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'

3

불행히도 re.escape()교체 문자열에는 적합하지 않습니다.

>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'

해결책은 교체품을 람다에 넣는 것입니다.

>>> re.sub('a', lambda _: '_', 'aa')
'__'

람다의 반환 값은 re.sub()리터럴 문자열로 처리되기 때문 입니다.


3
에 대한 repl인수 re.sub는 정규 표현식이 아닌 문자열입니다. re.escape그것을 적용 하는 것은 처음에는 의미가 없습니다.
tripleee

5
@tripleee 맞지 않습니다. repl인수는 단순한 문자열이 아닙니다. 파싱됩니다. 예를 들어, not re.sub(r'(.)', r'\1', 'X')이 반환됩니다 . X\1
Flimm

4
repl인수를
피하기

3
버전 3.3으로 변경 : '_'문자가 더 이상 이스케이프되지 않습니다. 버전 3.7으로 변경 : 정규식에서 특별한 의미를 가질 수있는 문자 만 이스케이프됩니다. (왜 그렇게 오래 걸리나요?)
시스 Timmerman

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