这甚至可能吗?
基本上,我想将这两个调用 sub 变成一个调用:
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')
我只关心第一个字符的大小写。其他都没有。
您可以使用函数来解析每个匹配项:
>>> 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'
好的,这是我想出的解决方案,感谢使用替换功能的建议。
re.sub(r'\b[Aa]word\b', lambda x: ('B' if x.group()[0].isupper() else 'b') + 'word', 'Aword aword.')
您可以传递一个使用 Match 对象作为参数的 lambda 函数作为替换函数:
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'
使用捕获组 ( r'\1'
):
re.sub(r'\b([Aa])word\b', r'\1word', "hello Aword")