문제

Python 정규식 및 역참조를 사용하여 문자열 이스케이프 처리를 구현하려고 하는데 잘 작동하지 않는 것 같습니다.분명 뭔가 잘못하고 있는 것 같은데 뭔지 알 수가 없네요...

>>> import re
>>> mystring = r"This is \n a test \r"
>>> p = re.compile( "\\\\(\\S)" )
>>> p.sub( "\\1", mystring )
'This is n a test r'
>>> p.sub( "\\\\\\1", mystring )
'This is \\n a test \\r'
>>> p.sub( "\\\\1", mystring )
'This is \\1 a test \\1'

\\[char]를 \[char]로 바꾸고 싶지만 Python의 역참조는 내가 사용한 다른 모든 구현에서와 동일한 규칙을 따르지 않는 것 같습니다.누군가가 약간의 빛을 비출 수 있습니까?

도움이 되었습니까?

해결책

이것이 앤더스의 두 번째 예가 하는 일이 아닌가?

2.5에는 string-escape 적용할 수 있는 인코딩:

>>> mystring = r"This is \n a test \r"
>>> mystring.decode('string-escape')
'This is \n a test \r'
>>> print mystring.decode('string-escape')
This is 
 a test 
>>> 

다른 팁

글쎄요, 제 생각엔 당신이 r을 놓쳤거나 백슬래시를 잘못 계산한 것 같아요...

"\\n" == r"\n"

>>> import re
>>> mystring = r"This is \\n a test \\r"
>>> p = re.compile( r"[\\][\\](.)" )
>>> print p.sub( r"\\\1", mystring )
This is \n a test \r
>>>

내가 이해했다면 요청한 것입니다.

더 일반적인 요청은 다음과 같습니다.

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'}
>>> p = re.compile(r"[\\]([nrfv])")
>>> print p.sub(lambda mo: d[mo.group(1)], mystring)
This is \
 a test \
>>>

관심 있는 학생은 Ken Thompson의 책도 읽어야 합니다. 신뢰에 대한 반성", 여기서 우리의 영웅은 비슷한 예를 사용하여 기계어 코드에서 직접 부트스트랩하지 않은 컴파일러를 신뢰하는 것의 위험성을 설명합니다.

이스케이프된 문자열을 읽고 이스케이프를 해제한다는 아이디어입니다(Python에는 특히 부족한 기능으로, 우선 정규식에 의존할 필요가 없습니다).불행히도 나는 백 슬래시에 속지 않습니다 ...

또 다른 예시:

>>> mystring = r"This is \n ridiculous"
>>> print mystring
This is \n ridiculous
>>> p = re.compile( r"\\(\S)" )
>>> print p.sub( 'bloody', mystring )
This is bloody ridiculous
>>> print p.sub( r'\1', mystring )
This is n ridiculous
>>> print p.sub( r'\\1', mystring )
This is \1 ridiculous
>>> print p.sub( r'\\\1', mystring )
This is \n ridiculous

내가 인쇄하고 싶은 것은

This is 
ridiculous

당신은 Python의 결과 문자열 표현에 속고 있습니다.파이썬 표현식:

'This is \\n a test \\r'

문자열을 나타냅니다

This is \n a test \r

내 생각엔 그게 당신이 원했던 것 같아요.문자열의 Python 표현 대신 반환된 실제 문자열을 인쇄하려면 각 p.sub() 호출 앞에 'print'를 추가해 보세요.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r

표시;그의 두 번째 예에서는 처음에 배열에 던져진 모든 이스케이프 문자가 필요하며, 이스케이프 시퀀스가 ​​배열에 없으면 KeyError가 발생합니다.제공된 세 문자 이외의 모든 문자에서는 종료되며(\v를 시도해 보십시오) 문자열을 이스케이프 해제하거나 전역 배열을 유지하려고 할 때마다 가능한 모든 이스케이프 시퀀스를 열거하는 것은 정말 나쁜 솔루션입니다.PHP와 유사합니다. preg_replace_callback() 대신 람다를 사용하여 preg_replace(), 이 상황에서는 전혀 필요하지 않습니다.

내가 그것에 대해 거만한 태도를 보인다면 미안합니다. 나는 Python에 완전히 좌절했습니다.이것은 내가 사용해 본 다른 모든 정규식 엔진에서 지원되는데 왜 이것이 작동하지 않는지 이해할 수 없습니다.

응답해 주셔서 감사합니다.그만큼 string.decode('string-escape') 기능은 제가 처음에 찾던 바로 그 기능입니다.누군가 정규식 역참조 문제에 대한 일반적인 해결책을 가지고 있다면 자유롭게 게시해 주시면 답변으로 받아들이겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top