如何找到文件中的所有数字条目

时间:2019-08-15 14:55:48

标签: python regex

我的文件的部分内容如下:

report from:PCAT1.DB   created at:2019-06-27 14:32:24   generated at:2019-06-27 14:35:10

number of campaigns:466

unique assets:950   downloaded assets:920   deleted assets:0   total assets: 922

我正在尝试做的是在某些标题旁边识别数字。即我想要唯一资产和总资产,然后将它们放入字典或列表中。

下面是我一直在使用的一些代码,但是它会提取所有至少包含3位数字的数字,因此我也得到了我不想要的时间/日期值。


assets = []

with open("C://AdSmart Results//Rack_54//cdb_report2.html") as adsmart:
    for line in adsmart.readlines():
        if re.search(r'assets:\d{3}', line):
            assets.append(line)

print(assets)

资产字典最终应填充资产类型和相应的值:

assets = { "Unique Assets": "950", "Total Assets": "922"}

一如既往,我们非常感谢所有帮助和指导。很抱歉,如果这是我在搜索中遗漏的一个问题的重复项。

2 个答案:

答案 0 :(得分:2)

我的猜测是,您可能希望设计一个带有两个捕获组的表达式,也许类似于:

(?i)\b([a-z][a-z\s]+\bassets?)\s*:\s*(\d+)

,您可能会添加更多边界。

测试

import re

regex = r"(?i)\b([a-z][a-z\s]+\bassets?)\s*:\s*(\d+)"

test_str = """
report from:PCAT1.DB   created at:2019-06-27 14:32:24   generated at:2019-06-27 14:35:10

number of campaigns:466

unique assets:950   downloaded assets:920   deleted assets:0   total assets: 922

report from:PCAT1.DB   created at:2019-06-27 14:32:24   generated at:2019-06-27 14:35:10

number of campaigns:466

unique assets:950   downloaded assets:920   deleted assets:0   total assets: 922

"""

print(dict(re.findall(regex, test_str)))

输出

{'unique assets': '950', 'downloaded assets': '920', 'deleted assets': '0', 'total assets': '922'}

  

如果您想探索/简化/修改表达式,可以   在右上角的面板上进行了说明   regex101.com。如果您愿意,   也可以在this link中观看它的匹配方式   针对一些样本输入。


RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:2)

这是我认为您想要的代码变体:

import re

assets = {}

with open("C://AdSmart Results//Rack_54//cdb_report2.html") as adsmart:
    for line in adsmart.readlines():
        for match in re.finditer(r'(\w+ assets):\s*(\d+)', line):
            assets[match.group(1)] = int(match.group(2))

print(assets)

发生了什么变化

  1. 每行有一个以上的图形,因此您需要遍历每行中的匹配项。因此,我将if re.search(...)更改为for match in re.finditer(...)re.search返回找到的第一个匹配项的Match对象(如果有),而re.finditer返回每一个匹配对象。然后我们可以遍历。

  2. 正则表达式(\w+ assets)匹配一个单词,然后是一个空格,然后是单词“ assets”

  3. 我不知道您是否只需要3位数字,但这就是\d{3}的含义。与\d\d\d相同。我将其更改为\d+,意思是“一个或多个数字”。

  4. 正则表达式中的括号是捕获组。因此,对于每个Match对象,match.group(1)是与第一对括号内的正则表达式匹配的文本,match.group(2)是第二对括号,依此类推。

  5. 我将assets从列表更改为字典,因为这就是您期望的输出中显示的内容。然后,我们可以将资产类型(match.group(1))映射到计数(int(match.group(2)))。

这是我得到的输出:

{'unique assets': 950, 'downloaded assets': 920, 'deleted assets': 0, 'total assets': 922}