我的文件的部分内容如下:
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"}
一如既往,我们非常感谢所有帮助和指导。很抱歉,如果这是我在搜索中遗漏的一个问题的重复项。
答案 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中观看它的匹配方式 针对一些样本输入。
jex.im可视化正则表达式:
答案 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)
发生了什么变化
每行有一个以上的图形,因此您需要遍历每行中的匹配项。因此,我将if re.search(...)
更改为for match in re.finditer(...)
。 re.search返回找到的第一个匹配项的Match
对象(如果有),而re.finditer返回每一个匹配对象。然后我们可以遍历。
正则表达式(\w+ assets)
匹配一个单词,然后是一个空格,然后是单词“ assets”
我不知道您是否只需要3位数字,但这就是\d{3}
的含义。与\d\d\d
相同。我将其更改为\d+
,意思是“一个或多个数字”。
正则表达式中的括号是捕获组。因此,对于每个Match
对象,match.group(1)
是与第一对括号内的正则表达式匹配的文本,match.group(2)
是第二对括号,依此类推。
我将assets
从列表更改为字典,因为这就是您期望的输出中显示的内容。然后,我们可以将资产类型(match.group(1)
)映射到计数(int(match.group(2))
)。
这是我得到的输出:
{'unique assets': 950, 'downloaded assets': 920, 'deleted assets': 0, 'total assets': 922}