[Python] Alternative to the `match = re.match(); if match: ...` idiom?

Discussão em 'Python' iniciado por Stack, Novembro 21, 2025.

  1. Stack

    Stack Membro Participativo

    If you want to check if something matches a regex, if so, print the first group, you do..

    import re
    match = re.match("(\d+)g", "123g")
    if match is not None:
    print match.group(1)


    This is completely pedantic, but the intermediate match variable is a bit annoying..

    Languages like Perl do this by creating new $1..$9 variables for match groups, like..

    if($blah ~= /(\d+)g/){
    print $1
    }


    From this reddit comment,

    with re_context.match('^blah', s) as match:
    if match:
    ...
    else:
    ...


    ..which I thought was an interesting idea, so I wrote a simple implementation of it:

    #!/usr/bin/env python2.6
    import re

    class SRE_Match_Wrapper:
    def __init__(self, match):
    self.match = match

    def __exit__(self, type, value, tb):
    pass

    def __enter__(self):
    return self.match

    def __getattr__(self, name):
    if name == "__exit__":
    return self.__exit__
    elif name == "__enter__":
    return self.__name__
    else:
    return getattr(self.match, name)

    def rematch(pattern, inp):
    matcher = re.compile(pattern)
    x = SRE_Match_Wrapper(matcher.match(inp))
    return x
    return match

    if __name__ == '__main__':
    # Example:
    with rematch("(\d+)g", "123g") as m:
    if m:
    print(m.group(1))

    with rematch("(\d+)g", "123") as m:
    if m:
    print(m.group(1))


    (This functionality could theoretically be patched into the _sre.SRE_Match object)

    It would be nice if you could skip the execution of the with statement's code block, if there was no match, which would simplify this to..

    with rematch("(\d+)g", "123") as m:
    print(m.group(1)) # only executed if the match occurred


    ..but this seems impossible based of what I can deduce from PEP 343

    Any ideas? As I said, this is really trivial annoyance, almost to the point of being code-golf..

    Continue reading...

Compartilhe esta Página