返回第一个匹配正则表达式的字符串

Lui*_*uez 64 python regex

我想获得正则表达式的第一场比赛.

在这种情况下,我得到了一个清单:

text = 'aa33bbb44'
re.findall('\d+',text)
Run Code Online (Sandbox Code Playgroud)

['33','44']

我可以提取列表的第一个元素:

text = 'aa33bbb44'
re.findall('\d+',text)[0]
Run Code Online (Sandbox Code Playgroud)

'33'

但是只有在至少有一个匹配时才有效,否则我会收到错误:

text = 'aazzzbbb'
re.findall('\d+',text)[0]
Run Code Online (Sandbox Code Playgroud)

IndexError:列表索引超出范围

在这种情况下,我可以定义一个函数:

def return_first_match(text):
    try:
        result = re.findall('\d+',text)[0]
    except Exception, IndexError:
        result = ''
    return result
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以在不定义新功能的情况下获得该结果?

Ste*_*ann 80

您可以''通过添加|$以下内容将默认值嵌入到正则表达式中:

>>> re.findall('\d+|$', 'aa33bbb44')[0]
'33'
>>> re.findall('\d+|$', 'aazzzbbb')[0]
''
>>> re.findall('\d+|$', '')[0]
''
Run Code Online (Sandbox Code Playgroud)

也适用于re.search其他人指出:

>>> re.search('\d+|$', 'aa33bbb44').group()
'33'
>>> re.search('\d+|$', 'aazzzbbb').group()
''
>>> re.search('\d+|$', '').group()
''
Run Code Online (Sandbox Code Playgroud)

  • @LuisRamonRamirezRodriguez它可以在找到匹配后立即停止,不必处理剩下的文本而不必存储所有匹配项.所以效率更高.另外,正如@TimPeters所说,它实际上是*"就是你想要的"*.当你或其他人在某个时候阅读它并且想知道"为什么`findall`被使用?"时,这可能是一个优势. (4认同)

Iro*_*ist 37

如果您只需要第一场比赛,那么请使用re.search而不是re.findall:

>>> m = re.search('\d+', 'aa33bbb44')
>>> m.group()
'33'
>>> m = re.search('\d+', 'aazzzbbb')
>>> m.group()
Traceback (most recent call last):
  File "<pyshell#281>", line 1, in <module>
    m.group()
AttributeError: 'NoneType' object has no attribute 'group'
Run Code Online (Sandbox Code Playgroud)

然后你可以m用作检查条件:

>>> m = re.search('\d+', 'aa33bbb44')
>>> if m:
        print('First number found = {}'.format(m.group()))
    else:
        print('Not Found')


First number found = 33
Run Code Online (Sandbox Code Playgroud)


小智 8

我会去:

r = re.search("\d+", ch)
result = return r.group(0) if r else ""
Run Code Online (Sandbox Code Playgroud)

re.search无论如何,它只会在字符串中查找第一个匹配项,因此我认为它的意图比使用更加清晰findall


Tim*_*ers 6

你根本不应该使用.findall()- .search()是你想要的.它找到最左边的匹配,这是你想要的(或者None如果不存在匹配则返回).

m = re.search(pattern, text)
result = m.group(0) if m else ""
Run Code Online (Sandbox Code Playgroud)

是否要将其放入函数中取决于您自己.如果没有找到匹配的话,想要返回一个空字符串是不寻常的,这就是为什么没有内置的内容.不可能对.search()自己是否找到一个匹配感到困惑(None如果它没有,它会返回,或者一个SRE_Match对象如果它确实).