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

时间:2016-07-26 01:19:34

标签: python regex

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

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

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]

有没有办法在不定义新功能的情况下获得该结果?

7 个答案:

答案 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)