Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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_Parsing - Fatal编程技术网

Python—在匹配行时使用特定公式解析该行

Python—在匹配行时使用特定公式解析该行,python,regex,parsing,Python,Regex,Parsing,我有一些实时数据包存储在文件log.log中,如下所示,我正在将log.log文件作为tail-f读取并解析它。但是所有的行都是随机的,没有固定的值,比如随机ip,在data::blocks中的随机值,每个data::都是一列值。e、 g在alog.log中 Ohter type of lines... [TCP]: incomeing data: 91 bytes, data=connect data::10.109.0.200data::10.109.0.86data::wandata::p

我有一些实时数据包存储在文件
log.log
中,如下所示,我正在将
log.log
文件作为
tail-f
读取并解析它。但是所有的行都是随机的,没有固定的值,比如随机ip,在
data::blocks
中的随机值,每个data::都是一列值。e、 g在a
log.log中

Ohter type of lines...
[TCP]: incomeing data: 91 bytes, data=connect data::10.109.0.200data::10.109.0.86data::wandata::p4data::1400data::800data::end
[TCP]: incomeing data: 91 bytes, data=connect data::10.109.0.201data::10.109.8.86data::landata::p4data::1400data::700data::end
[TCP]: incomeing data: 91 bytes, data=connect data::10.109.0.200data::10.109.58.86data::3gdata::p4data::400data::800data::end
something.. else...
现在,我如何解析该行?其中,它可以忽略任何内容,并且仅在匹配时进行分析:

connect data::ANYdata::ANYdata::ANYdata::ANYdata::ANYdata::ANYdata::end
运行:

myparse.py:

import sys, time, os, subprocess
import re

def p(command):
  subprocess.Popen(command, shell=False, stdin=subprocess.PIPE,  stdout=subprocess.PIPE)

while True:
  line = sys.stdin.readline()
  if line:
    if "command:start" in line:
      print "OK - working"
      p("/var/tmp/single_thread_process.sh")  

    if "connect data::" in line:
      ..

    else:
      # ^(?:\+|00)(\d+)$ Parse the 0032, 32, +32
      #match = re.search(r'^(?:\+|00)(\d+)$', line)
      #if match:
        #print "OK"

      ### NOT working ### 
      match = re.search(r'^connect data::*data::*data::*data::*data::*data::*data::end$', line)
      if match:
        print "OK"
尝试使用:

match = re.search(r'connect data::[^:]+::[^:]+::[^:]+::[^:]+::[^:]+::[^:]+::end$', line)
线锚的开头是阻止匹配的第一件事

另外,
*
在正则表达式中不是通配符,它是一个表示0次或多次的量词。您可以使用
[^:::::+
表示“除冒号以外的任何字符”


+1。可以通过量化子模式来简化正则表达式:
r'connect data::([^::+:){6}end$'
@FMc-Yup。我最初只是想对OP当前的正则表达式进行尽可能少的更改,然后忘记了重复^^;谢谢你的提醒!
match = re.search(r'connect data::[^:]+::[^:]+::[^:]+::[^:]+::[^:]+::[^:]+::end$', line)