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)