Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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'\?.*', чтобы соответствовать буквальному ?