【问题标题】:re.VERBOSE and a dictre.VERBOSE 和 dict
【发布时间】:2020-11-02 03:35:13
【问题描述】:

我有这个带有一些日志的 .txt* 我正在尝试将值“-”分配给“user_name”,以防文件没有用户名。但是,在这些情况下,输出字典会显示这个“user_name”:“”。你知道我做错了什么吗?我也试过 item.groupdict["user_name"] = "-",但显然这不是问题的根源......

import re
with open("logdata.txt", "r") as file:
    logdata = file.read()
logs = []
pattern = """
(?P<host>[\d.]+)[-\s]+
(?P<user_name>\w*)\s+
\[(?P<time>[^][]+)\]\s+
"(?P<request>[^"]+)"
"""

for item in re.finditer(pattern,logdata,re.VERBOSE):
    **if item.groupdict("user_name") == None:
        item["user_name"] = '-'**
    logs.append(item.groupdict())

这是一个txt示例:

71.172.239.195 - dooley1853 [21/Jun/2019:15:45:32 -0700] "PUT /cutting-edge HTTP/2.0" 406 24498
180.95.121.94 - mohr6893 [21/Jun/2019:15:45:34 -0700] "PATCH /extensible/reinvent HTTP/1.1" 201 27330
144.23.247.108 - auer7552 [21/Jun/2019:15:45:35 -0700] "POST /extensible/infrastructures/one-to-one/enterprise HTTP/1.1" 100 22921

【问题讨论】:

  • 我怀疑重新匹配对象实现了任何方式来修改匹配结果。您需要将 groupdict 检索到一个变量中,修改 那个 dict,然后将其附加到您的列表中。

标签: python regex dictionary


【解决方案1】:

您可以将item.groupdict() 保存在变量中并修改其内容,然后再将其附加到logs

for item in re.finditer(pattern, logdata, re.VERBOSE):
    params = item.groupdict()
    if params["user_name"] == "":
        params["user_name"] = "-"

    logs.append(params)

或者您可以更改您的正则表达式以使第二组可选 (?) 但只匹配具有至少一个字符 (\w+) 的单词,然后使用 default parameter of item.groupdict():

import re

with open("logdata.txt", "r") as file:
    logdata = file.read()

logs = []
pattern = """
(?P<host>[\d.]+)[-\s]+
(?P<user_name>\w+)?\s+
\[(?P<time>[^][]+)\]\s+
"(?P<request>[^"]+)"
"""

for item in re.finditer(pattern, logdata, re.VERBOSE):
    logs.append(item.groupdict(default="-"))

【讨论】:

    【解决方案2】:

    我使用了一种更简单的技术

    \S+ 至少一次不是空格

    import re
    with open("logdata.txt", "r") as file:
        logdata = file.read()
    logs = []
    pattern = """
    (?P<host>[\d.]+)[-\s]+
    (?P<user_name>\S+)\s+
    \[(?P<time>[^][]+)\]\s+
    "(?P<request>[^"]+)"
    """
    
    for item in re.finditer(pattern,logdata,re.VERBOSE):
        logs.append(item.groupdict())
    

    完美运行。我相信我有点太晚了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2018-05-18
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多