【问题标题】:Extract occurrence of text between brackets from a text file Python从文本文件Python中提取括号之间出现的文本
【发布时间】:2019-02-26 02:33:22
【问题描述】:

日志文件:

INFO:werkzeug:127.0.0.1 - - [20/Sep/2018 19:40:00] "GET /socket.io/?polling HTTP/1.1" 200 -
INFO:engineio: Received packet MESSAGE, ["key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}]

我有兴趣仅从包含关键字 "key" 的括号中提取文本,而不是从下面提取与正则表达式模式匹配的所有匹配项。

这是我迄今为止尝试过的:

import re
with open('logfile.log', 'r') as text_file:
    matches = re.findall(r'\[([^\]]+)', text_file.read())
    with open('output.txt', 'w') as out:
        out.write('\n'.join(matches))

这会输出与正则表达式匹配的所有匹配项。 output.txt 的所需输出如下所示:

"key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}

【问题讨论】:

  • 您要提取的所有消息是否都包含"key",或者这只是一个示例?输出可以假设多少结构?
  • 是的,所需的提取消息将包含相同的关键字“key”。至于输出结构,它应该包含上面示例日志文件 sn-p 中方括号内的所有文本。
  • 如果"key" 可以出现在方括号内的任何位置,请尝试print(re.findall(r'\[([^][]*"key"[^][]*)]', text_file.read()))
  • 然后您可以制作您正在寻找的正则表达式的那一部分:re.findall(r'\["key"([^\]]+)', text_file.read())。这就是你要找的吗?
  • @JohanL 我试过了,它似乎没有用,尽管它的方向是正确的。感谢您的回复!

标签: python regex logfile-analysis


【解决方案1】:

匹配方括号内不能包含[],但应该包含一些其他文本的文本可以与[^][] 否定字符类匹配。

也就是说,您可以将方括号内的整个文本与\[[^][]*]匹配,如果您需要匹配其中的某些文本,则需要将该文本放在[^][]*之后,然后在之前附加另一个出现的[^][]*闭幕式]

你可以使用

re.findall(r'\[([^][]*"key"[^][]*)]', text_file.read()) 

Python demo

import re
s = '''INFO:werkzeug:127.0.0.1 - - [20/Sep/2018 19:40:00] "GET /socket.io/?polling HTTP/1.1" 200 - 
INFO:engineio: Received packet MESSAGE, ["key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}]'''
print(re.findall(r'\[([^][]*"key"[^][]*)]', s)) 

输出:

['"key",{"data":{"tag1":12,"tag2":13,"tag3": 14"...}}']

【讨论】:

  • 谢谢!这非常有效!只是为了详细说明一种通用的方式来匹配我们有 key1key2 的实例。匹配 = re.findall(r'[([^][]*"key.*"[^][]*)]', text_file.read())
  • @spinState010 可能是key[12]key\d+ 而不是key
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2010-09-27
  • 2014-08-07
  • 2014-07-31
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多