Python 如何查找文件中的所有数字条目
我有一个文件,其中的一个部分如下所示:Python 如何查找文件中的所有数字条目,python,regex,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 我试图做的是识别某些标题旁边的数字。也就是说,我需要唯一资产和总资
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"}
一如既往,我们非常感谢所有的帮助和指导。如果这是我在搜索中漏掉的问题的重复,我深表歉意。我猜您可能希望设计一个包含两个捕获组的表达式,可能类似于:
(?i)\b([a-z][a-z\s]+\bassets?)\s*:\s*(\d+)
你可以增加更多的边界
试验
输出
如果您希望探索/简化/修改该表达式,它已被删除 在的右上面板上进行了说明 . 如果你愿意,你可以 也可以观看,它将如何匹配 对照一些样本输入
正则表达式电路 可视化正则表达式:
以下是代码的一个变体,我认为它可以按照您的要求工作:
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(…)
更改为以在re.finditer(…)
中查找匹配项。而对于找到的第一个匹配项(如果有),返回一个Match
对象,则返回每个匹配项对象。然后我们可以绕过去(\w+assets)
首先匹配一个单词,然后匹配一个空格,然后匹配单词“assets”\d{3}
的含义。它与\d\d\d
相同。我把它改为\d+
,意思是“一个或多个数字”Match
对象,Match.group(1)
是匹配第一对括号内正则表达式的文本,Match.group(2)
是第二个,以此类推assets
从列表更改为dict,因为这是您在所需输出中显示的内容。然后我们可以将资产类型(match.group(1)
)映射到计数(int(match.group(2))
){'unique assets': 950, 'downloaded assets': 920, 'deleted assets': 0, 'total assets': 922}
你是如何得到时间和日期号码的?它们前面没有
资产:
。您将遇到的另一个问题是,一旦找到与正则表达式匹配的内容(assets.append(line)
)。因此,当它找到[…]资产时:950[…]您将把整行添加到您的资产字典中。太好了,这正是我需要的信息。非常感谢。非常感谢。我已经预订了这些页面,因为我认为它们将来会非常有用。
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)
{'unique assets': 950, 'downloaded assets': 920, 'deleted assets': 0, 'total assets': 922}