[英]match numbers if line starts with keyword
我有一个看起来像这样的文件:
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)
但我想知道,是否有可能将这些组合成一个正则表达式?
谢谢你的帮助,医学博士
不完全是你要求的,但由于建议在可能的情况下使用标准的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
这将返回'foo'之后的数字,即使它在字符串中的任何位置而不是在开头:
with open('numbers.txt', 'r') as f:
[re.findall(r'\d+\.\d+', line.partition('foo')[2]) for line in f]
如果文件中的所有行始终具有相同的数字,则可以使用以下正则表达式:
"^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文档。
你可以不用第一个正则表达式,而是通过比较行的前四个字符来过滤列表理解中的行,并编译内部正则表达式:
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:"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.