regex error - nothing to repeat

PythonRegex

Python Problem Overview


I get an error message when I use this expression:

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

I checked the regex at RegExr and it returns . as expected. But when I try it in Python I get this error message:

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

Can someone please explain?

Python Solutions


Solution 1 - Python

It seems to be a python bug (that works perfectly in vim). The source of the problem is the (\s*...)+ bit. Basically , you can't do (\s*)+ which make sense , because you are trying to repeat something which can be 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

However (\s*\1) should not be null, but we know it only because we know what's in \1. Apparently python doesn't ... that's weird.

Solution 2 - Python

That is a Python bug between "*" and special characters.

Instead of

re.compile(r"\w*")

Try:

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

It works, however does not make the same regular expression.

This bug seems to have been fixed between 2.7.5 and 2.7.6.

Solution 3 - Python

It's not only a Python bug with * actually, it can also happen when you pass a string as a part of your regular expression to be compiled, like ;

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)

this will cause an error if processed line contained some "(+)" for example, like you can find in chemical formulae, or such chains of characters. the solution is to escape but when you do it on the fly, it can happen that you fail to do it properly...

Solution 4 - Python

regular expression normally uses * and + in theory of language. I encounter the same bug while executing the line code

re.split("*",text)

to solve it, it needs to include \ before * and +

re.split("\*",text)

Solution 5 - Python

Beyond the bug that was discovered and fixed, I'll just note that the error message sre_constants.error: nothing to repeat is a bit confusing. I was trying to use r'?.*' as a pattern, and thought it was complaining for some strange reason about the *, but the problem is actually that ? is a way of saying "repeat zero or one times". So I needed to say r'\?.*'to match a literal ?

Solution 6 - Python

I had this problem when using the regex \b?. Using \s? fixed the issue (although it's not the same thing)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongohView Question on Stackoverflow
Solution 1 - Pythonmb14View Answer on Stackoverflow
Solution 2 - PythonFranklynView Answer on Stackoverflow
Solution 3 - PythonAndo JuraiView Answer on Stackoverflow
Solution 4 - PythonAyoub ArroubView Answer on Stackoverflow
Solution 5 - PythonnealmcbView Answer on Stackoverflow
Solution 6 - PythonrobertspierreView Answer on Stackoverflow