Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何查找文件中的所有数字条目_Python_Regex - Fatal编程技术网

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}