- 此问题在此处已有答案**:
re.findall behaves weird(3个答案)
昨天关门了。
请看下面的代码,我正在使用re.search
测试两个字符串的模式,第一个字符串为True,第二个字符串为False--这是有意义的,因为第二个字符串缺少数字,所以它与模式不完全匹配。
然而,当我在第一个字符串上使用re.findall
时,它返回"Under",这实际上并不是一个匹配!预期行为是返回"Under 1.5"。
有人能解释一下这个差异吗?如果有更好的函数可以使用,请让我知道。谢谢!
import re
over_under1 = "Total Match Points Under 1.5"
over_under2 = "Total Match Points Under"
x = bool(re.search("(Over |Under )\d+\.?\d*",over_under1))
y = bool(re.search("(Over |Under )\d+\.?\d*",over_under2))
print(x) # True
print(y) # False
z = re.findall("(Over |Under )\d+\.?\d*",over_under1)[0]
print(z) # Under
1条答案
按热度按时间pwuypxnk1#
您看到的差异是由于re.findall()函数的工作方式造成的。re.findall()将模式的所有非重叠匹配作为字符串列表返回,而re.search()将第一个匹配作为match对象返回。
在您的情况下,模式“(完毕|Under)\d+.?\d*”匹配第一个字符串中的子字符串“Under”,然后将其作为唯一匹配返回,因为它没有找到任何其他匹配该模式的匹配项。
但是,如果希望查找匹配的文本沿着数字,可以使用re.search()函数代替re.findall(),并使用group()方法获取匹配的字符串。
复制代码导入
over_under1 =“低于1.5的总匹配点数”over_under2 =“低于1.5的总匹配点数”
匹配=re.search(“(结束|下)\d+.?\d*",over_under1)print(match.group())#打印“1.5下”
匹配=re.search(“(结束|Under)\d+.?\d*",over_under2)print(match.group())# prints 'None'之所以有效,是因为group()方法只会返回匹配的字符串,而不会返回正则表达式模式中定义的任何子组。
此外,您可以使用re.match()函数代替re.search(),如果第一个匹配出现在字符串的开头,则返回第一个匹配,否则返回None。