Python正则表达式多个模式的不匹配组错误

0 投票
1 回答
965 浏览
提问于 2025-04-18 14:30

我在尝试回答一个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)

但我后来发现,这样做并没有去掉125ie之间的点,所以我想试试匹配另一个模式,也就是:

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'

撰写回答