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

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

问题描述:

我想匹配浮点数,可能是在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 +)中?部分。

+0

什么是'1:0.00003 3:0.123456 8:-0.12345'?从哪里抽取的字符串? – user2963623

+0

http://www.regular-expressions.info/floatingpoint.html –

+0

感谢您提供的信息 – daydayup

见强调:

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

如果您想抓住我列入的示例来说明捕获组的工作原理,我会删除我的答案。 – chepner

使用非捕获组。匹配成功,但输出是不匹配的可选组的内容。

看到输出,当你输入包括像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仅包括在其输出中捕获组内的部分。

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

现在,通过捕获基团转化为一个非捕获基,findall再次使用其输出的正则表达式整个的匹配。

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

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

+0

谢谢!你能解释为什么捕获的一个(我写的)没有捕获数字,而使用它捕获的非捕获组?我仍然不明白如何不捕捉作品。在(?:...)中是什么?代表?我只是不明白这一点,虽然它对你来说很直观 – daydayup

+1

当你的正则表达式包含一个捕获组'(...),'findall'命令的输出包含组的内容。在你的情况下,由于捕获组是可选的('(...)?'),因此该组不匹配任何文本,因此输出中不包含任何文本。当你使用'(?:...)'而不是简单的'(...)'使这个组成为非捕获组时,'findall'使用与其输出中整个正则表达式相匹配的文本。 – chepner

+0

这听起来像任何可选字符串(可能或可能不包含),我也应该使用非捕获组来获取findall()输出的东西? – daydayup