全部交易
我在解析日志方面面临一些不小的问题。
我需要浏览一个文件并检查该行是否与模式匹配: 如果是,则在此行中指定ClientID。
该行看起来像:
17.02.09 10:42:31.242 TRACE [1245] GDS: someText(SomeText).ClientID: '' -> '99071901'
所以我需要获得99071901。
我尝试构建正则表达式搜索模式,但它并不完整..在“TRACE':
regex = '(^[(\d\.)]+) ([(\d\:)]+) ([\bTRACE\b]+) ([(\d)]+) ([\bGDS\b:)]+) ([\ClientID\b])'
脚本代码是:
log=open('t.log','r')
for i in log:
key=re.search(regex,i)
print(key.group()) #print string matching
for g in key:
client_id=re.seach(????,g) # find ClientIt
log.close()
如果你给我一个如何解决这个挑战的提示,请感谢。
谢谢。
答案 0 :(得分:2)
你不需要过于具体。您可以捕获这些部分并单独解析它们。
让我们从你的一行开始,例如:
line = "17.02.09 10:42:31.242 TRACE [1245] GDS: someText(SomeText).ClientID: '' -> '99071901'"
然后让我们添加第一个获取所有部分的正则表达式:
import re
line_regex = re.compile(r'(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+):\s+(.+)')
# now extract each section
date, time, level, thread, module, message = line_regex.match(line).groups()
现在,如果我们查看不同的部分,他们将获得我们做出更多决策所需的所有信息,或者进一步解析它们。现在,当正确的消息显示时,我们可以获取客户端ID。
client_id_regex = re.compile(r".*ClientID: '' -> '(\d+)'")
if 'ClientID' in message:
client_id = client_id_regex.match(message).group(1)
现在我们有client_id
。
只需将这个逻辑运用到你的循环中就可以了。
line_regex = re.compile(r'(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+):\s+(.+)')
client_id_regex = re.compile(r".*ClientID: '' -> '(\d+)'")
with open('t.log','r') as f: # use with context manager to auto close the file
for line in f: # lets iterate over the lines
sections = line_regex.match(line) # make a match object for sections
if not sections:
continue # probably you want to handle this case
date, time, level, thread, module, message = sections.groups()
if 'ClientID' in message: # should we even look here for a client id?
client_id = client_id_regex.match(message).group(1)
# now do what you wanted to do
答案 1 :(得分:1)
您可以在您感兴趣的模式中使用围绕这些部分的捕获括号,然后使用group(n)
访问这些部分,其中n
是相应的组ID:
import re
s = "17.02.09 10:42:31.242 TRACE [1245] GDS: someText(SomeText).ClientID: '' -> '99071901'"
regex = r"^([\d.]+)\s+([\d.:]+)\s+(TRACE)\s+\[(\d+)] GDS:.*?ClientID:\s*''\s*->\s*'(\d+)'$"
m = re.search(regex, s)
if m:
print(m.group(1))
print(m.group(2))
print(m.group(3))
print(m.group(4))
print(m.group(5))
模式是
^([\d.]+)\s+([\d.:]+)\s+(TRACE)\s+\[(\d+)] GDS:.*?ClientID:\s*''\s*->\s*'(\d+)'$
请注意,您已将字符类与组混为一谈:(...)
将子模式分组并捕获它们,而[...]
定义与单个字符匹配的字符类。