如果行以关键字开头,匹配数字

4 投票
3 回答
964 浏览
提问于 2025-04-17 05:25

我有一个文件,内容大概是这样的:

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]

撰写回答