Python正则表达式多个模式的不匹配组错误
我在尝试回答一个StackOverflow上的问题时遇到了一个问题。简单来说,有个用户有这样一个字符串:
Adobe.Flash.Player.14.00.125.ie
他想把它替换成
Adobe Flash Player 14.00.125 ie
于是我用下面的re.sub
方法来解决这个问题:
re.sub("([a-zA-Z])\.([a-zA-Z0-9])",r"\1 \2",str)
但我后来发现,这样做并没有去掉125
和ie
之间的点,所以我想试试匹配另一个模式,也就是:
re.sub("([a-zA-Z])\.([a-zA-Z0-9])|([0-9])\.([a-zA-Z])",r"\1\3 \2\4",str)
当我尝试运行这个时,我遇到了以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/re.py", line 151, in sub
return _compile(pattern, 0).sub(repl, string, count)
File "/usr/lib64/python2.6/re.py", line 278, in filter
return sre_parse.expand_template(template, match)
File "/usr/lib64/python2.6/sre_parse.py", line 793, in expand_template
raise error, "unmatched group"
sre_constants.error: unmatched group
现在,我明白这是因为我试图用一个没有匹配的组来替换匹配的内容,但有没有办法可以避免两次调用re.sub
呢?
1 个回答
1
没有任何捕获组,
>>> import re
>>> s = "Adobe.Flash.Player.14.00.125.ie"
>>> m = re.sub(r'\.(?=[A-Za-z])|(?<!\d)\.', r' ', s)
>>> m
'Adobe Flash Player 14.00.125 ie'