0

我正在执行一个标准的正则表达式:

Bill Gates → GATES, Bill

所以我这样做:

In [21]: re.sub("([^ ]+) (.+)", r"\2".upper() + r", \1", "Bill Gates")
Out[21]: 'Gates, Bill'

为什么它不起作用?如何将字符串方法应用于匹配的字符串?

4

1 回答 1

3

您正在大写(部分)替换模式,而不是实际替换结果

r"\2".upper() + r", \1"表达式在将值传递给"\\2, \\1" 之前re.sub()生成值。

要动态处理匹配组,您需要在传递给的函数中应用您的更改,.sub()而不是替换模式:

def uppercase_last(match):
    return "{}, {}".format(match.group(2).upper(), match.group(1))

re.sub("([^ ]+) (.+)", uppercase_last, "Bill Gates")

演示:

>>> import re
>>> def uppercase_last(match):
...     return "{}, {}".format(match.group(2).upper(), match.group(1))
... 
>>> re.sub("([^ ]+) (.+)", uppercase_last, "Bill Gates")
'GATES, Bill'

或者,根本不要使用正则表达式:

>>> name = 'Bill Gates'
>>> first, rest = name.split(None, 1)
>>> "{}, {}".format(rest.upper(), first)
于 2013-05-15T11:55:19.043 回答