我想获得正则表达式的第一场比赛。
在这种情况下,我得到了一个清单:
canProcessInMemory
[' 33',' 44']
我可以提取列表的第一个元素:
text = 'aa33bbb44'
re.findall('\d+',text)
' 33'
但只有在至少有一场比赛时才有效,否则我会收到错误:
text = 'aa33bbb44'
re.findall('\d+',text)[0]
IndexError:列表索引超出范围
在这种情况下,我可以定义一个函数:
text = 'aazzzbbb'
re.findall('\d+',text)[0]
有没有办法在不定义新功能的情况下获得该结果?
答案 0 :(得分:54)
您可以通过添加''
在您的正则表达式中嵌入|$
默认值:
>>> 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()
''
答案 1 :(得分:28)
如果您只需要第一场比赛,请使用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
答案 2 :(得分:5)
您根本不应该使用.findall()
- .search()
就是您想要的。它找到最左边的匹配,这是你想要的(或者如果不存在匹配则返回None
。)
m = re.search(pattern, text)
result = m.group(0) if m else ""
是否要将其放入函数中取决于您自己。如果找不到匹配项,那么异常想要返回一个空字符串,这就是为什么没有内置的内容。不可能对.search()
自己是否找到匹配感到困惑(如果没有,则返回None
,如果确实,则返回SRE_Match
对象。)
答案 3 :(得分:5)
我选择:
r = re.search("\d+", ch)
result = return r.group(0) if r else ""
re.search
只会在字符串中查找第一个匹配,所以我认为这比使用findall
更明确了。
答案 4 :(得分:1)
你可以这样做:
x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''
请注意,您的问题与正则表达式并不完全相关。相反,如果没有数组,你如何安全地从数组中找到一个元素。
答案 5 :(得分:1)
如果更多的输入数据不包含您想要的部分,这可能会更好一些,因为除了成本更高。
def return_first_match(text):
result = re.findall('\d+',text)
result = result[0] if result else ""
return result
答案 6 :(得分:0)
只需将结果分配给变量然后迭代变量
text = 'aa33bbb44'
result=re.findall('\d+',text)
for item in result:
print(item)