我想获得正则表达式的第一场比赛.
在这种情况下,我得到了一个清单:
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)
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。
你根本不应该使用.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对象如果它确实).
| 归档时间: |
|
| 查看次数: |
101711 次 |
| 最近记录: |