Python 返回第一个匹配正则表达式的字符串
我想得到正则表达式的第一个匹配项 在本例中,我得到了一个列表:Python 返回第一个匹配正则表达式的字符串,python,regex,Python,Regex,我想得到正则表达式的第一个匹配项 在本例中,我得到了一个列表: text = 'aa33bbb44' re.findall('\d+',text) ['33','44'] 我可以提取列表中的第一个元素: text = 'aa33bbb44' re.findall('\d+',text)[0] ‘33’ 但这仅在至少有一个匹配项时有效,否则我将得到一个错误: text = 'aazzzbbb' re.findall('\d+',text)[0] 索引器:列表索引超出范围 在这种情况下,我可以
text = 'aa33bbb44'
re.findall('\d+',text)
['33','44']
我可以提取列表中的第一个元素:
text = 'aa33bbb44'
re.findall('\d+',text)[0]
‘33’
但这仅在至少有一个匹配项时有效,否则我将得到一个错误:
text = 'aazzzbbb'
re.findall('\d+',text)[0]
索引器:列表索引超出范围
在这种情况下,我可以定义一个函数:
def return_first_match(text):
try:
result = re.findall('\d+',text)[0]
except Exception, IndexError:
result = ''
return result
有没有一种方法可以在不定义新函数的情况下获得该结果?您可以执行以下操作:
x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''
请注意,您的问题与regex并不完全相关。相反,如果数组中没有元素,您如何安全地从数组中找到该元素。如果更多的输入数据不包含您想要的元素,因为except的成本更高,那么这可能会更好一些
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.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'
你根本不应该使用
.findall()
,.search()
就是你想要的。它查找最左边的匹配项,这是您想要的(如果不存在匹配项,则返回None
)
是否要将其放入函数中取决于您。如果没有找到匹配项,则希望返回空字符串是不常见的,这就是为什么没有内置类似的内容。不可能混淆.search()
是否自己找到匹配项(如果没有,则返回None
,如果找到,则返回SRE\u match
对象)。我会选择:
r = re.search("\d+", ch)
result = return r.group(0) if r else ""
re.search
无论如何只查找字符串中的第一个匹配项,因此我认为这比使用findall
更清楚,只需将结果分配给一个变量,然后迭代该变量即可
text = 'aa33bbb44'
result=re.findall('\d+',text)
for item in result:
print(item)
我想在这里用简单的“x”替换“len(x)>0”。太好了,search/.group比findall/[0]有什么优势吗?@LuisRamonRamirezRodriguez它可以在找到匹配项后立即停止,不必处理其余文本,也不必存储所有匹配项。所以它更有效。此外,正如@TimPeters所说,它字面上是“你想要的”。当你或其他人在某个时候读到它并想知道“为什么使用
findall
时,这可能是一个优势。对我来说,接受的答案不起作用。我必须删除数组索引访问,并使用len(re.findAll)==0
检查。
r = re.search("\d+", ch)
result = return r.group(0) if r else ""
text = 'aa33bbb44'
result=re.findall('\d+',text)
for item in result:
print(item)