返回正则表达式第一个匹配的字符串,处理没有匹配的情况

我想得到第一个匹配的正则表达式。

在这种情况下,我有一个列表:

text = 'aa33bbb44'
re.findall('\d+',text)

[’33’,’44’]

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

text = 'aa33bbb44'
re.findall('\d+',text)[0]

33年

但是,只有在至少有一个匹配的情况下,这种方法才有效,否则我将得到一个错误:

text = 'aazzzbbb'
re.findall('\d+',text)[0]

IndexError: 列表索引超出范围

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

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

有没有一种不用定义新函数就能得到结果的方法?

253954 次浏览

你可以这样做:

x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''

请注意,您的问题并不完全与正则表达式相关。相反,如果数组中没有元素,那么如何安全地从数组中找到元素。

如果大量的输入数据不包含您想要的部分,因为除了具有更大的成本,那么这样做可能会执行得更好一些。

def return_first_match(text):
result = re.findall('\d+',text)
result = result[0] if result else ""
return result

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

>>> re.findall('\d+|$', 'aa33bbb44')[0]
'33'
>>> re.findall('\d+|$', 'aazzzbbb')[0]
''
>>> re.findall('\d+|$', '')[0]
''

也与其他人指出的 re.search合作:

>>> re.search('\d+|$', 'aa33bbb44').group()
'33'
>>> re.search('\d+|$', 'aazzzbbb').group()
''
>>> re.search('\d+|$', '').group()
''

如果您只需要第一个匹配,那么使用 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'

然后,您可以使用 m作为检查条件:

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




First number found = 33

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

m = re.search(pattern, text)
result = m.group(0) if m else ""

是否将其放入函数取决于您自己。如果没有找到匹配项,那么返回空字符串就是 不寻常,这就是为什么没有内置这样的字符串。不可能混淆 .search()是否自己找到了匹配(如果没有,返回 None,如果找到了,返回 SRE_Match对象)。

我会说:

r = re.search("\d+", ch)
result = r.group(0) if r else ""

无论如何,re.search只在字符串中寻找 第一匹配,所以我认为它比使用 findall稍微更清楚地表明了您的意图。

只需将结果赋给一个变量,然后迭代该变量

 text = 'aa33bbb44'
result=re.findall('\d+',text)
for item in result:
print(item)

具有赋值表达式(PEP572) :

text = 'aa33bbb44'
r = m.group() if (m:=re.search(r'\d+',text)) is not None else ''