当前位置: 首页 > 面试题库 >

python-正则表达式搜索和findall

鲜于阳
2023-03-14
问题内容

我需要在给定正则表达式的字符串中找到所有匹配项。我一直在findall()这样做,直到遇到一个案例,它没有达到我的预期。例如:

regex = re.compile('(\d+,?)+')
s = 'There are 9,000,000 bicycles in Beijing.'

print re.search(regex, s).group(0)
> 9,000,000

print re.findall(regex, s)
> ['000']

在这种情况下,search()返回我需要的内容(最长的匹配项),但是findall()行为却有所不同,尽管文档暗示它应该是相同的:

findall()匹配所有出现的模式,而不仅仅是第一个search()

  • 为什么行为不同?

  • 如何获得search()with findall() (或其他方式)的结果?


问题答案:

好的,我从文档中查看发生了什么……

如果该模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。如果模式包含多个组,则这将是一个元组列表。

事实证明,您确实有一个组“(\ d + ,?)” …因此,它返回的是该组的最后一次出现,即000。

一种解决方案是像这样将整个正则表达式围成一团

regex = re.compile('((\d+,?)+)')

然后,它将返回[(‘9,000,000’,‘000’)],它是包含两个匹配组的元组。当然,您只关心第一个。

就个人而言,我将使用以下正则表达式

regex = re.compile('((\d+,)*\d+)')

为了避免匹配“这是一个错误的数字9,123”之类的东西,

编辑。

这是一种避免用括号将表达式括起来或处理元组的方法

s = "..."
regex = re.compile('(\d+,?)+')
it = re.finditer(regex, s)

for match in it:
  print match.group(0)

finditer返回一个迭代器,您可以使用该迭代器访问找到的所有匹配项。这些匹配对象与re.search返回的对象相同,因此group(0)返回您期望的结果。



 类似资料:
  • 问题内容: 我需要找到与特定正则表达式匹配的所有软件包: 基本上,包的名字应该与启动,并有后话。例如,以下软件包应匹配: 我可以做,但是有很多我不感兴趣的软件包。 是否提供通过正则表达式查找软件包的方法?或者,我应该只是通过管道传递结果来过滤掉无关的包? 此外,可能是一个的“交集” ,并有助于太。 问题答案: alecxe,我相信这是您要寻找的一线客。 如下面评论中铬酸盐所建议的那样,您可以根据需

  • 我有: 使用正则表达式我想搜索并返回:

  • 问题内容: 我试图在Python 2.7.2中使用正则表达式从字符串中提取所有出现的带标记单词。或者简单地说,我想提取标签内的所有文本。这是我的尝试: 印刷产品 要获取的正确正则表达式是: 或。 谢谢。:) 问题答案: 产量 regex与unicode完全相同,但难于阅读。 第一个括号组告诉重新任何列表中的字符应匹配,并且同样与第二组括号。那你想什么都不要。所以, 卸下外围的方括号。(也除去杂散前

  • 我的正则律很糟糕。我想建立一个智能搜索,在那里我可以给搜索引擎提示在哪个属性上搜索什么。 类似这样: 搜索输入:位置:伦敦 - 搜索输入:位置:纽约伦敦 - 搜索输入:位置:伦敦标签:栏 - - 搜索输入:地点:伦敦,纽约标签:酒吧,俱乐部 - - 我想知道正则表达式应该如何解析这样的用户输入?

  • 问题内容: 我想在包含单行的超大文件(fe大于1 GB)中搜索模式。无法将其加载到内存中。目前,我使用读入缓冲区(1024个字符)。主要步骤: 将数据读入两个缓冲区 该缓冲区中的搜索模式 如果找到模式,则增加变量 将第二个缓冲区复制到第一个 将数据加载到第二个缓冲区 在两个缓冲区中搜索模式。 如果找到模式,则增加变量 重复上述步骤(从4开始),直到EOF 该算法(两个缓冲区)让我避免了将搜索到的文