ошибка регулярного выражения - нечего повторять - PullRequest
57 голосов
/ 09 сентября 2010

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

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

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

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

Может кто-нибудь объяснить, пожалуйста?

Ответы [ 4 ]

40 голосов
/ 09 сентября 2010

Кажется, это ошибка 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 не ... это странно.

14 голосов
/ 24 октября 2011

Это ошибка Python между "*" и специальными символами.

Вместо

re.compile(r"\w*")

Попробуйте:

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

Работает, но не создает того же регулярного выражения.

Эта ошибка, кажется, была исправлена ​​между 2.7.5 и 2.7.6.

4 голосов
/ 20 июня 2017

Это не только ошибка 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)

, это вызовет ошибку, еслиНапример, обработанная строка содержит некоторые символы «(+)», которые вы можете найти в химических формулах, или такие цепочки символов.решение состоит в том, чтобы сбежать, но когда вы делаете это на лету, может случиться так, что вы не сделаете это правильно ...

3 голосов
/ 05 октября 2017

Помимо обнаруженной и исправленной ошибки, отмечу, что сообщение об ошибке sre_constants.error: nothing to repeat немного сбивает с толку. Я пытался использовать r'?.*' в качестве шаблона и думал, что по какой-то странной причине жалуется на *, но проблема в том, что ? - это способ сказать «повторить ноль или один раз». Поэтому мне нужно было сказать r'\?.*', чтобы соответствовать буквальному ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...