programing tip

정규식 오류-반복 할 사항 없음

itbloger 2020. 12. 13. 09:01
반응형

정규식 오류-반복 할 사항 없음


이 식을 사용할 때 오류 메시지가 나타납니다.

re.sub(r"([^\s\w])(\s*\1)+","\\1","...")

RegExr 에서 정규식을 확인 했는데. 예상대로 반환 됩니다. 그러나 Python에서 시도하면 다음 오류 메시지가 나타납니다.

raise error, v # invalid expression
sre_constants.error: nothing to repeat

누군가 설명해 주시겠습니까?


파이썬 버그 인 것 같습니다 (vim에서 완벽하게 작동합니다). 문제의 원인은 (\ s * ...) + 비트입니다. 기본적으로, 당신은 (\s*)+null이 될 수있는 것을 반복하려고하기 때문에 의미 있는 것을 할 수 없습니다 .

>>> re.compile(r"(\s*)+")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 180, in compile
    return _compile(pattern, flags)
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 233, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat

그러나 (\s*\1)null이 아니어야하지만 \ 1에 무엇이 있는지 알기 때문에 알 수 있습니다. 분명히 파이썬은 ... 이상하지 않습니다.


이것은 "*"와 특수 문자 사이의 파이썬 버그입니다.

대신에

re.compile(r"\w*")

시험:

re.compile(r"[a-zA-Z0-9]*")

작동하지만 동일한 정규식을 만들지는 않습니다.

이 버그는 2.7.5에서 2.7.6 사이에서 수정 된 것으로 보입니다.


실제로 *가있는 파이썬 버그 일뿐만 아니라 컴파일 할 정규 표현식의 일부로 문자열을 전달할 때도 발생할 수 있습니다.

import re
input_line = "string from any input source"
processed_line= "text to be edited with {}".format(input_line)
target = "text to be searched"
re.search(processed_line, target)

예를 들어 화학 공식에서 찾을 수있는 것처럼 처리 된 줄에 일부 "(+)"가 포함 된 경우 오류가 발생합니다. 해결책은 탈출하는 것이지만, 즉석에서 할 때 제대로하지 못할 수도 있습니다.


발견 및 수정 된 버그 외에도 오류 메시지 sre_constants.error: nothing to repeat가 약간 혼란 스럽다는 점에 주목하겠습니다 . 나는 r'?.*'패턴 으로 사용하려고했고 에 대해 이상한 이유로 불평한다고 생각 *했지만 실제로 문제는 그것이 ?"0 회 또는 1 회 반복"이라고 말하는 방식이라는 것입니다. 그래서 나는 r'\?.*'리터럴과 일치 하도록 말해야 했습니다?

참고 URL : https://stackoverflow.com/questions/3675144/regex-error-nothing-to-repeat

반응형