正则表达式:可以包含字符串,也可以不包含字符串

2024-04-19 04:03:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想匹配一个浮点数,它的形式可能是0.1234567或1.23e-5 下面是我的python代码:

import re
def main():
    m2 = re.findall(r'\d{1,4}:[-+]?\d+\.\d+(e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345')
    for svs_elem in m2:
         print svs_elem

main()

它打印空白。。。根据我的测试,问题出在(e-\d+)?部分。在


Tags: 代码inimportreformaindef空白
2条回答

见重点:

Help on function findall in module re:
findall(pattern, string, flags=0)
    Return a list of all non-overlapping matches in the string.
    If one or more groups are present in the pattern, return a
    list of groups; this will be a list of tuples if the pattern
    has more than one group.
    Empty matches are included in the result.

您有一个组,因此返回它而不是整个匹配项,但在任何情况下都不匹配。使用(?:e-\d+)使其不捕获:

^{pr2}$

使用非捕获组。匹配是成功的,但输出的是可选组的内容,这些组的内容与实际上不匹配。在

当您的输入包含e-6时,请查看输出:

>>> re.findall(r'\d{1,4}:[-+]?\d+\.\d+(e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345e-6')
['', '', 'e-6']

对于非捕获组((?:...)):

^{pr2}$

下面是一些简单的示例来演示捕获组是如何工作的以及它们如何影响findall的输出。首先,不分组:

>>> re.findall("a[bc]", "ab")
["ab"]

在这里,字符串“ab”匹配正则表达式,所以我们打印正则表达式匹配的所有内容。在

>>> re.findall("a([bc])", "ab")
["b"]

这一次,我们将[bc]放在一个捕获组中,因此即使整个字符串仍然由正则表达式匹配,findall在其输出中只包含捕获组中的部分。在

>>> re.findall("a(?:[bc])", "ab")
["ab"]

现在,通过将捕获组转换为非捕获组,findall再次在其输出中使用整个regex的匹配。在

>>> re.findall("a([bc])?", "a")
['']
>>> re.findall("a(?:[bc])?", "a")
['a']

在最后两种情况下,正则表达式作为一个整体匹配,因此返回值是一个非空列表。在第一个文件中,捕获组本身与任何文本都不匹配,因此空字符串是输出的一部分。在第二种情况下,我们没有捕获组,因此整个正则表达式的匹配将用于输出。在

相关问题 更多 >