在Python中,为什么这个炸弹:
>>>re.compile(r'(?:.*){1}')
何时起作用
>>>re.compile(r'(?:.+){1}')
我刚检查过,在Perl中,两者都运行良好。现在我不喜欢Perl。我不需要Perl。但这是一个常规表达引擎问题。为什么Python引擎不能理解这么简单的东西?
答案 0 :(得分:3)
这些都适合我:
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> p1 = re.compile(r'(?:.*){1}')
>>> m1 = p1.match("foo")
>>> m1.group()
'foo'
>>> p2 = re.compile(r'(?:.+){1}')
>>> m2 = p2.match("foo")
>>> m2.group()
'foo'
答案 1 :(得分:2)
第一个正则表达式试图重复一个可能不存在的事物的实例,因此是一个无效的正则表达式。 第二个将始终重复一次非空字符串。
例如,在第一个正则表达式中,没有检查空实例将被重复多少次,在第二个中,它就是错误实例。
>>> re.compile(r'(?:.*)xyz')
<_sre.SRE_Pattern object at 0x1a867b0>
>>> re.compile(r'(?:.*){1}')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/re.py", line 190, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.7/re.py", line 242, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
答案 2 :(得分:1)
你不能做的原因
re.compile(r'{1}')
有或没有什么可重复的。
我认为以下正则表达式应该与您的预期相同:
re.compile(r'((?:)|(?:.+){1})')