如果行以关键字开头,匹配数字
我有一个文件,内容大概是这样的:
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
相关问题:
3 个回答
0
你可以不使用第一个正则表达式,而是通过比较每行的前四个字符来过滤列表中的行,并且可以把里面的正则表达式编译起来:
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:"]
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的文档。
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')]
更新
这样做会返回'foo'后面的数字,即使它出现在字符串的任何地方,而不仅仅是在开头:
with open('numbers.txt', 'r') as f:
[re.findall(r'\d+\.\d+', line.partition('foo')[2]) for line in f]