在Python正则表达式中,为什么我不能多次匹配0或更多

时间:2015-04-23 08:42:09

标签: python regex

在Python中,为什么这个炸弹:

>>>re.compile(r'(?:.*){1}')

何时起作用

>>>re.compile(r'(?:.+){1}')

我刚检查过,在Perl中,两者都运行良好。现在我不喜欢Perl。我不需要Perl。但这是一个常规表达引擎问题。为什么Python引擎不能理解这么简单的东西?

3 个答案:

答案 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})')