Regex in python: is it possible to get the match, replacement, and final string?

前端 未结 2 521
再見小時候
再見小時候 2020-12-29 03:39

For doing a regex substitution, there are three things that you give it:

  • The match pattern
  • The replacement pattern
  • The original string
  • <
2条回答
  •  萌比男神i
    2020-12-29 04:03

    class Replacement(object):
    
        def __init__(self, replacement):
            self.replacement = replacement
            self.matched = None
            self.replaced = None
    
        def __call__(self, match):
            self.matched = match.group(0)
            self.replaced = match.expand(self.replacement)
            return self.replaced
    
    >>> repl = Replacement('not the \\1')
    >>> re.sub('(orig.*?l)', repl, 'This is the original string.')
        'This is the not the original string.'
    >>> repl.matched
        'original'
    >>> repl.replaced
        'not the original'
    

    Edit: as @F.J has pointed out, the above will remember only the last match/replacement. This version handles multiple occurrences:

    class Replacement(object):
    
        def __init__(self, replacement):
            self.replacement = replacement
            self.occurrences = []
    
        def __call__(self, match):
            matched = match.group(0)
            replaced = match.expand(self.replacement)
            self.occurrences.append((matched, replaced))
            return replaced
    
    >>> repl = Replacement('[\\1]')
    >>> re.sub('\s(\d)', repl, '1 2 3')
        '1[2][3]'
    
    >>> for matched, replaced in repl.occurrences:
       ....:     print matched, '=>', replaced
       ....:     
     2 => [2]
     3 => [3]
    

提交回复
热议问题