2011-11-01 55 views
4

开始我有一个类似如下的文件:匹配数字,如果符合关键字

foo: 11.00 12.00 bar 13.00 
bar: 11.00 12.00 bar 
foo: 11.00 12.00 

,并想与关键字开头的行提取所有号码为“foo”。预期结果:

['11.00', '12.00', '13.00'] 
['11.00', '12.00'] 

现在,这很容易,如果我用两个正则表达式,像这样:

if re.match('^foo:', line): 
     re.findall('\d+\.\d+', line) 

但我想知道,如果有可能将这些组合成一个单一的正则表达式?

感谢您的帮助, MD

+0

您正则表达式表明,“富”应该来在该行的开始,但你不提它在描述中。情况确实如此吗? – egor83

+0

是的,就是这样。我改变了描述。 –

+4

简短回答:不,你不能在同一个正则表达式中执行这两个操作,如果你不知道会有多少数字,至少不能用Python。但是,您可以在.NET中执行此操作,但在后向断言中存在不确定的重复:'(?<=^foo。*)\ d + \。\ d +'(使用'RegexOptions.Multiline'选项)。 –

回答

0

如果文件中的所有行始终有相同数量的数字,你可以使用下面的正则表达式:

"^foo:[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)" 

例子:

>>> import re 
>>> line = "foo: 11.00 12.00 bar 13.00" 
>>> re.match("^foo:[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)[^\d]*(\d*\.\d*)", line).groups() 
('11.00', '12.00', '13.00') 
>>> 

在正则表达式的一部分周围使用括号将其变成可从匹配对象中提取的组。有关更多信息,请参阅Python文档。

+0

谢谢,但不,我恐怕这个数字是可变的,我会修改这个例子来反映这一点。 –

4

不是你问什么了,但因为它是推荐使用标准的Python的工具,而不是正则表达式在可能的情况,我会做这样的事情:

import re 

with open('numbers.txt', 'r') as f: 
    [re.findall(r'\d+\.\d+', line) for line in f if line.startswith('foo')] 

UPDATE

这将返回

with open('numbers.txt', 'r') as f: 
    [re.findall(r'\d+\.\d+', line.partition('foo')[2]) for line in f] 
0

您可以在不第一正则表达式做,而不是过滤林:后“富”,即使它的字符串,而不是仅仅在开始的任何地方的数字在列表理解ES通过比较该行的前四个字符,并编制内的正则表达式:

import re 

with open("input.txt", "r") as inp: 
    prog=re.compile("\d+\.\d+") 
    results=[prog.findall(line) for line in inp if line[:4]=="foo:"]