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

时间:2015-05-09 16:25:21

标签: python regex

我想匹配一个可能是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 +)?部分。

2 个答案:

答案 0 :(得分:4)

看重点:

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+)

使其无法捕获
m2 = re.findall(r'\d{1,4}:[-+]?\d+\.\d+(?:e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345')

答案 1 :(得分:3)

使用非捕获组。匹配正在成功,但输出是 don 实际匹配的可选组的内容。

当您的输入包含e-6

之类的内容时,请参阅输出
>>> re.findall(r'\d{1,4}:[-+]?\d+\.\d+(e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345e-6')
['', '', 'e-6']

使用非捕获组((?:...)):

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

以下是一些简单的示例,用于演示捕获组如何工作以及它们如何影响findall的输出。首先,没有团体:

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

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

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

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

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

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

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

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