Ошибка регулярного выражения - ничего не повторять
Я получаю сообщение об ошибке, когда я использую это выражение:
re.sub(r"([^\s\w])(\s*\1)+","\\1","...")
Я проверил регулярное выражение на RegExr и возвращает .
, как ожидалось. Но когда я пытаюсь в Python, я получаю это сообщение об ошибке:
raise error, v # invalid expression
sre_constants.error: nothing to repeat
Может кто-нибудь объяснит?
Ответы
Ответ 1
Кажется, это ошибка python (отлично работает в vim).
Источником проблемы является бит (\ s *...)+. В принципе, вы не можете сделать (\s*)+
, что имеет смысл, потому что вы пытаетесь повторить то, что может быть нулевым.
>>> 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)
не должен быть нулевым, но мы знаем это только потому, что знаем, что в \1. По-видимому, python не... это странно.
Ответ 2
Это ошибка Python между "*" и специальными символами.
Вместо
re.compile(r"\w*")
Try:
re.compile(r"[a-zA-Z0-9]*")
Он работает, однако не делает того же регулярного выражения.
Эта ошибка, по-видимому, исправлена между 2.7.5 и 2.7.6.
Ответ 3
Это не только ошибка Python с * на самом деле, это также может произойти, когда вы передаете строку как часть вашего обычного выражения, которое нужно скомпилировать, например:
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)
это приведет к ошибке, если в обработанной строке содержится некоторая "(+)", например, как вы можете найти в химических формулах или таких цепочках символов.
решение заключается в том, чтобы убежать, но когда вы делаете это "на лету", может случиться так, что вы не сделаете это правильно...
Ответ 4
Помимо обнаруженной и исправленной ошибки, я просто заметлю, что сообщение об ошибке sre_constants.error: nothing to repeat
немного запутанно. Я пытался использовать r'?.*'
как шаблон и думал, что он жалуется по какой-то странной причине на *
, но проблема в том, что ?
- это способ сказать "повторить нуль или один раз". Поэтому мне нужно было сказать r'\?.*'
, чтобы соответствовать буквальному ?