Getting captured group in one line

前端 未结 9 1033
既然无缘
既然无缘 2020-12-16 18:23

There is a known \"pattern\" to get the captured group value or an empty string if no match:

match = re.search(\'regex\', \'text\')
if match:
    value = mat         


        
相关标签:
9条回答
  • 2020-12-16 18:41

    One line for you, although not quite Pythonic.

    find_text = lambda text: (lambda m: m and m.group(1) or '')(PATTERN.search(text))
    

    Indeed, in Scheme programming language, all local variable constructs can be derived from lambda function applications.

    0 讨论(0)
  • 2020-12-16 18:54

    Re: "Is there a simple and pythonic way to do this in one line?" The answer is no. Any means to get this to work in one line (without defining your own wrapper), is going to be uglier to read than the ways you've already presented. But defining your own wrapper is perfectly Pythonic, as is using two quite readable lines instead of a single difficult-to-read line.

    0 讨论(0)
  • 2020-12-16 18:58

    Quoting from the MatchObjects docs,

    Match objects always have a boolean value of True. Since match() and search() return None when there is no match, you can test whether there was a match with a simple if statement:

    match = re.search(pattern, string)
    if match:
       process(match)
    

    Since there is no other option, and as you use a function, I would like to present this alternative

    def find_text(text, matches = lambda x: x.group(1) if x else ''):
        return matches(PATTERN.search(text))
    
    assert find_text('foo=bar,key=value,beer=pub') == 'value'
    assert find_text('no match here') == ''
    

    It is the same exact thing, but only the check which you need to do has been default parameterized.

    Thinking of @Kevin's solution and @devnull's suggestions in the comments, you can do something like this

    def find_text(text):
        return next((item.group(1) for item in PATTERN.finditer(text)), "")
    

    This takes advantage of the fact that, next accepts the default to be returned as an argument. But this has the overhead of creating a generator expression on every iteration. So, I would stick to the first version.

    0 讨论(0)
提交回复
热议问题