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