我有一个看起来像这样的文件:
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 :(得分: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]
答案 1 :(得分: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文档。
答案 2 :(得分: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:"]