Python 문자열에서 정규식 특수 문자 이스케이프


126

파이썬에는 정규 표현식에서 특수 문자를 이스케이프하는 데 사용할 수있는 함수가 있습니까?

예를 들어는 I'm "stuck" :\이어야합니다 I\'m \"stuck\" :\\.


2
특별한 캐릭터라고 생각하는 것은 무엇입니까?
pafcu 2010

1
전적으로 당신의 상황에 달려 있습니다. 일반적으로 이러한 문자는 문자열 안에 있으면 완전히 괜찮습니다.
찌를

답변:


197

사용하다 re.escape

>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

여기에서 반복 :

re.escape (문자열)

영숫자가 아닌 모든 백 슬래시가있는 문자열을 반환합니다. 이것은 정규식 메타 문자를 포함 할 수있는 임의의 리터럴 문자열을 일치시키려는 경우 유용합니다.

Python 3.7 re.escape()부터는 정규식 작업에 의미있는 문자 만 이스케이프하도록 변경되었습니다.


1
re 대신 regex 모듈을 사용할 수 있습니다. 예는 것 regex.escape(pattern,string,special_only=True
Lokinou

17

아무도 re.sub()다음을 통해 정규 표현식을 사용하지 않았다는 것에 놀랐습니다 .

import re
print re.sub(r'([\"])',    r'\\\1', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\\\1', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"')  # it\'s\ \"this\"

참고할 중요한 사항 :

  • 에서 검색 패턴을 포함 \당신이 찾고있는 문자 (들)뿐만 아니라. 당신이 사용하게 될 겁니다 \탈출 할 수 있도록, 캐릭터를 탈출하는 것을 잘한다.
  • 주위에 괄호를 넣어 검색 예 : 패턴, ([\"])그렇게하는 것이, 대체 가 추가 할 때 패턴이 발견 된 문자를 사용할 수 있습니다 \그것의 앞에. (그게 뭐야 \1 : 첫 번째 괄호로 묶인 그룹의 값을 사용합니다.)
  • r앞에 r'([\"])'수단은 A의 날 문자열 . 원시 문자열은 백 슬래시를 이스케이프하기 위해 다른 규칙을 사용합니다. ([\"])일반 문자열로 쓰려면 모든 백 슬래시를 두 배로하고 '([\\"])'. 정규식을 작성할 때 원시 문자열이 더 친숙합니다.
  • 에서 대체 패턴, 당신은 탈출 할 필요가 \예를 들면 대체 그룹 앞에 백 슬래시, 구별하기 위해 \1, 따라서 r'\\\1'. 쓰려면 일반 문자열로, 당신은 필요한 것 '\\\\\\1'- 그리고 아무도 그것을 원하지 않는다.

9

repr () [1 : -1]을 사용합니다. 이 경우 큰 따옴표를 이스케이프 할 필요가 없습니다. [-1 : 1] 슬라이스는 시작과 끝에서 작은 따옴표를 제거하는 것입니다.

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

아니면 프로그램에 붙여 넣을 구를 이스케이프하고 싶습니까? 그렇다면 다음을 수행하십시오.

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'

3
문자열이 유니 코드 인 경우 U를하고 실행해야하기 때문 작동하지 않습니다repr(x)[2:-1]
앙투안 부인용 외투를

모든 문자열이 유니 코드 인 python3.4에서는 불행히도 전혀 작동하지 않는 것 같습니다. 대신, print(repr("I'm stuck")[1:-1])인쇄 I'm stuck.
dantiston

3

위에서 언급했듯이 대답은 귀하의 경우에 따라 다릅니다. 정규식에 대한 문자열을 이스케이프하려면 re.escape ()를 사용해야합니다. 그러나 특정 문자 집합을 이스케이프하려면 다음 람다 함수를 사용하십시오.

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\

1

그렇게 어렵지 않습니다.

def escapeSpecialCharacters ( text, characters ):
    for character in characters:
        text = text.replace( character, '\\' + character )
    return text

>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\

3
백 슬래시가 그중 하나라면 characters첫 번째가 낫습니다!
steveha

0

일부 문자 만 바꾸려면 다음을 사용할 수 있습니다.

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.