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

re.findall不返回全场比赛吗?

司寇祖鹤
2023-03-14
问题内容

我有一个包含一堆字符串的文件,例如“ size =
XXX;”。我第一次尝试使用python的re模块,并且对以下行为感到有些困惑:如果我在正则表达式中使用管道作为“或”,我只会看到返回的匹配项。例如:

>>> myfile = open('testfile.txt','r').read()
>>> print re.findall('size=50;',myfile)
['size=50;', 'size=50;', 'size=50;', 'size=50;']
>>> print re.findall('size=51;',myfile)
['size=51;', 'size=51;', 'size=51;']
>>> print re.findall('size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']
>>> print re.findall(r'size=(50|51);',myfile)
['51', '51', '51', '50', '50', '50', '50']

匹配的“大小=”部分不见了。(但是,肯定会在搜索中使用它,否则将会有更多结果)。我究竟做错了什么?


问题答案:

您遇到的问题是,如果re.findall尝试匹配的正则表达式捕获组(即,括号中包含的正则表达式部分),则返回的是组,而不是匹配的字符串。

解决此问题的一种方法是使用非捕获组(前缀为?:)。

>>> import re
>>> s = 'size=50;size=51;'
>>> re.findall('size=(?:50|51);', s)
['size=50;', 'size=51;']

如果re.findall尝试匹配的正则表达式没有捕获任何内容,它将返回整个匹配的字符串。

尽管在这种特殊情况下使用字符类可能是最简单的选择,但非捕获组提供了更通用的解决方案。

我认为您要使用[]而不是()。[]表示字符集,而()表示组匹配。尝试这样的事情:

print re.findall('size=5[01];', myfile)


 类似资料:
  • 好的,基本上,我试图遍历大量包含文件超链接的html代码。我在用preg_match_all找到所有发生的事情。然而,它永远不会返回预期的匹配量。 快照HTML代码(值为$content): PHP代码: 上面的代码只为我返回第一个匹配项。奇怪的是,回荡着: 所以我想我应该数一数数组,然后把它绕成一个for循环来解决这个问题。然而:

  • 问题内容: 这仅返回结果,我需要返回全部89%。有任何想法如何做吗? 问题答案: 简单的解决方案: 更漂亮的解决方案: 最漂亮的解决方案:

  • 问题内容: 受到一个现已删除的问题的启发;给定带有命名组的正则表达式,是否有类似的方法返回具有命名捕获组的列表而不是列表? 鉴于: 应该改为: 问题答案:

  • 是否可以编写一个正则表达式,其中匹配1的最后一个符号是匹配2的开始符号?我喜欢匹配括号中的所有数字,并用管道隔开。情况也很复杂,因为比赛只能有一组深度。 这是我的字符串: 我想得到: 1234年 但是正则表达式应该不匹配: 我只找到了这个正则表达式{1}(\d)和这个问题,他还匹配了这样的文本(123 Text)。 我有一个关于regex101的例子:https://regex101.com/r/

  • 比赛速度功能有助于您保持稳定配速,并在设定距离内达到您的目标时间。定义某段距离的目标时间 - 例如将 10 公里跑步的目标时间设定为 45 分钟,并跟踪对比实际用时与这个预设目标的差距。 您可以在手表上设置比赛速度,或者可以在 Flow 网络服务或应用程序中设置比赛速度目标,并同步至手表。 如果您已计划好当天的比赛速度目标,手表会在进入训练准备模式时建议您启动该目标。 在手表上创建比赛速度目标 您

  • 比赛速度功能有助于您保持稳定配速,并在设定距离内达到您的目标时间。定义某段距离的目标时间 - 例如将 10 公里跑步的目标时间设定为 45 分钟,并跟踪对比实际用时与这个预设目标的差距。 您可以在手表上设置比赛速度,或者可以在 Flow 网络服务或应用中设置比赛速度目标,并同步至手表。 如果您已计划好当天的比赛速度目标,手表会在进入训练准备模式时建议您启动该目标。 在手表上创建比赛速度目标 您可以