【问题标题】:Trying to restrict regex match scope试图限制正则表达式匹配范围
【发布时间】:2017-06-07 02:20:57
【问题描述】:

这里是Python新手,请原谅这个愚蠢的问题。 我正在尝试从一组 gzip 文件中提取日志数据。 数据跨越多行,因此我尝试从其压缩的 tar 文件中提取每个文件,并将其作为单个对象读取,如下所示: 正则表达式:

first_match = re.compile(r"(?P<date>\d{4}[-]?\d{1,2}[-]?\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}).*?http://servername:99999/chargeit.*?manager_event=first.*?\bwantThisUser=([^&]*).*?\b_operator=(\w+).*?request\:.*?Want-To-Have-This\:\s\*123\*0\#")

 tfile = tarfile.open("logfile-year-month-day.number.log.tar.gz", "r")
     for filename in tfile.getmembers():
          f = tfile.extractfile(filename).read()
          f = str(f)
          for match in first_match.finditer(f):
              linecount = linecount + 1
              print(linecount, match.group(1), match.group(2), match.group(3))

我正在尝试匹配时间戳以及日志文件中的另外两个组。 如果逐行打印,日志数据看起来有点像这样:

2016-12-16 20:43:47 DEBUG[ispatcher-12570] this.is.the.api.Api - http://servername:99999/chargeit?session_id=1d7cb257e22946abbb3a14b17f232505&manage_event=first&wantThisUser=4119057000083&_source=operator3 b90e7798-8abd-4cf4-9660-45d6527e2804 request:
 HEADERS:
  this-is-a-header: 200
  Want-To-Have-This: *123*200#
  Host: servername:99999
  Accept: */*
  User-Agent: AHC/2.0
  Timeout-Access: <function1>
 CONTENT:

2016-12-16 20:43:47 DEBUG[ispatcher-12571] this.is.the.api.Api - http://servername:99999/chargeit?session_id=20111&manage_event=first&wantThisUser=4119185011005&_operator=operator4 926fa104-e72f-46e8-a5fc-912ef9707a01 request:
 HEADERS:
  this-is-a-header: 0
  Want-To-Have-This: *123*0#
  Host: servername:99999
  Accept: */*
  User-Agent: AHC/2.0
  Timeout-Access: <function1>
 CONTENT:

2016-12-16 20:26:29 DEBUG[ispatcher-12563] this.is.the.api.Api - http://servername:99999/chargeit?session_id=a5e456ad2f5645c39a580463630cd3db&manage_event=first&wantThisUser=4119023107960&_source=operator2 1021c087-1918-40a3-a7c1-4b7c37690471 request:
 HEADERS:
  this-is-a-header: 1000*0111111111
  Want-To-Have-This: *123*1000*0111111111#
  Host: servername:99999
  Accept: */*
  User-Agent: AHC/2.0
  Timeout-Access: <function1>
 CONTENT:

我希望能抓住这个:

    2016-12-16 20:43:47 DEBUG[ispatcher-12571] this.is.the.api.Api - http://servername:99999/chargeit?session_id=20111&manage_event=first&wantThisUser=4119185011005&_operator=operator4 926fa104-e72f-46e8-a5fc-912ef9707a01 request:
 HEADERS:
  this-is-a-header: 0
  Want-To-Have-This: *123*0#

我希望捕获的组是时间戳:(2016-12-16 20:43:4)wantThisUser= (4119185011005) 和 _operator= (operator4) 的值。

相反,正则表达式捕获目标行,以及它上面的那些:

2016-12-16 20:43:47 DEBUG[ispatcher-12570] this.is.the.api.Api - http://servername:99999/chargeit?session_id=1d7cb257e22946abbb3a14b17f232505&manage_event=first&wantThisUser=4119057000083&_source=operator3 b90e7798-8abd-4cf4-9660-45d6527e2804 request:
 HEADERS:
  this-is-a-header: 200
  Want-To-Have-This: *123*200#
  Host: servername:99999
  Accept: */*
  User-Agent: AHC/2.0
  Timeout-Access: <function1>
 CONTENT:

2016-12-16 20:43:47 DEBUG[ispatcher-12571] this.is.the.api.Api - http://servername:99999/chargeit?session_id=20111&manage_event=first&wantThisUser=4119185011005&_operator=operator4 926fa104-e72f-46e8-a5fc-912ef9707a01 request:
 HEADERS:
  this-is-a-header: 0
  Want-To-Have-This: *123*0#

它会从所需匹配项上方的行中提取时间戳和其他两组。 请问如何将匹配限制在自己的行中?还是我以错误的方式处理这个问题?

【问题讨论】:

  • 没有必要为你的问题道歉 :)
  • 我可能会在数据的多个级别上逐步解决这个问题,而不是全部使用正则表达式。首先,我将日志数据拆分为记录/日志条目,然后我将采用第一行,我会将正则表达式应用于提取时间戳和整个 URI 的第一行。然后我会使用一个库将 URI 及其查询参数解析为字典。然后我会通过索引字典来访问 wantThisUser 和 _operator。
  • 问题在于日志行的排序方式。 'Want-To-Have-This:(.*)' 行是我正在寻找的,它有几种字符串形式,我可以用来分隔数据。当我有了那条线时,我现在需要 URI 中的组来告诉我操作何时发生。这就是为什么我想把它收集起来。
  • 嗯,记录/日志条目是指从时间戳到下一个空白行的部分。这意味着每条记录都将包含您感兴趣的所有数据,并且不会包含来自下一条记录的相同数据,因此不会有意外捕获“Want-To-Have-This”的危险下一条记录。
  • 好的,我想我可以找到整个日志行的匹配项,然后根据我正在寻找的其他正则表达式在这个主要匹配项中查找“子匹配项”?我认为从日志行中我非常确定时间戳开始它并且字符串“CONTENT:”字符串结束它。

标签: python regex python-3.5 tarfile


【解决方案1】:

谢谢,@blubberdibulb! 你帮我将块匹配正则表达式缩小到first_match = re.compile(r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.*?(?=^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|\Z)", re.DOTALL|re.MULTILINE) 这使得解析更易于管理的块。 现在一切都变得更好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多