私は標準の正規表現を実行しています:
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)