我正在执行一个标准的正则表达式:
Bill Gates → GATES, Bill
所以我这样做:
In [21]: re.sub("([^ ]+) (.+)", r"\2".upper() + r", \1", "Bill Gates")
Out[21]: 'Gates, Bill'
为什么它不起作用?如何将字符串方法应用于匹配的字符串?
您正在大写(部分)替换模式,而不是实际替换结果。
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)