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 に答える