ошибка регулярного выражения - нечего повторять


Я получаю сообщение об ошибке, когда я использую это выражение:

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

Я проверил регулярное выражение в RegExr и это возвращает . как и ожидалось. Но когда я пытаюсь его в Python я получаю это сообщение об ошибке:

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

кто-нибудь может объяснить?

4 52

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'\?.*'чтобы соответствовать литерал ?