6

これも可能ですか?

基本的に、subへのこれら2つの呼び出しを1つの呼び出しに変換したいと思います。

re.sub(r'\bAword\b', 'Bword', mystring)
re.sub(r'\baword\b', 'bword', mystring)

私が本当に欲しいのは、次のような条件付き置換表記のようなものです。

re.sub(r'\b([Aa])word\b', '(?1=A:B,a:b)word')

私は最初の文字の大文字化だけを気にします。他のどれも。

4

4 に答える 4

8

すべての一致を解析する関数を使用できます。

>>> def f(match):
        return chr(ord(match.group(0)[0]) + 1) + match.group(0)[1:]

>>> re.sub(r'\b[aA]word\b', f, 'aword Aword')
'bword Bword'
于 2012-06-30T16:48:56.717 に答える
5

OK、これが私が思いついた解決策です。置換機能を使用するための提案のおかげです。

re.sub(r'\b[Aa]word\b', lambda x: ('B' if x.group()[0].isupper() else 'b') + 'word', 'Aword  aword.')
于 2012-06-30T16:49:18.860 に答える
4

置換関数としてMatchオブジェクトをパラメーターとして使用するラムダ関数を渡すことができます。

import re
re.sub(r'\baword\b', 
       lambda m: m.group(0)[0].lower() == m.group(0)[0] and 'bword' or 'Bword',
       'Aword aword', 
       flags=re.I)
# returns: 'Bword bword'
于 2012-06-30T16:48:58.900 に答える
-1

キャプチャグループを使用する(r'\1'):

 re.sub(r'\b([Aa])word\b', r'\1word', "hello Aword")
于 2020-04-24T21:44:56.210 に答える