How do I write a regex to replace a word but keep its case in Python?

前端 未结 4 2073
暗喜
暗喜 2021-01-01 00:48

Is this even possible?

Basically, I want to turn these two calls to sub into a single call:

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


        
相关标签:
4条回答
  • 2021-01-01 01:01

    You can pass a lambda function which uses the Match object as a parameter as the replacement function:

    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'
    
    0 讨论(0)
  • 2021-01-01 01:03

    OK, here's the solution I came up with, thanks to the suggestions to use a replace function.

    re.sub(r'\b[Aa]word\b', lambda x: ('B' if x.group()[0].isupper() else 'b') + 'word', 'Aword  aword.')
    
    0 讨论(0)
  • 2021-01-01 01:06

    You can have functions to parse every match:

    >>> 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'
    
    0 讨论(0)
  • 2021-01-01 01:17

    Use capture groups (r'\1'):

     re.sub(r'\b([Aa])word\b', r'\1word', "hello Aword")
    
    0 讨论(0)
提交回复
热议问题