Python 打印可选正则表达式

Python 打印可选正则表达式,python,regex,Python,Regex,我正试图打印出字典中存储的值。这些值是从正则表达式创建的 目前我有一些可选字段,但我不确定是否正确 B区?字段C字段D 我读了一篇参考书,上面写着?表示0或1次出现 当我尝试搜索诸如声誉或内容类型之类的字段时,我没有得到任何结果,因为这些在我的正则表达式中是可选的。我可能有错误的正则表达式,但我想知道为什么每次搜索可选字段时。。。?它没有打印出来 我的代码: import re httpproxy515139 = re.compile(r'....url\=\"(?P<url>(.

我正试图打印出字典中存储的值。这些值是从正则表达式创建的

目前我有一些可选字段,但我不确定是否正确

B区?字段C字段D

我读了一篇参考书,上面写着?表示0或1次出现

当我尝试搜索诸如声誉或内容类型之类的字段时,我没有得到任何结果,因为这些在我的正则表达式中是可选的。我可能有错误的正则表达式,但我想知道为什么每次搜索可选字段时。。。?它没有打印出来

我的代码:

import re

httpproxy515139 = re.compile(r'....url\=\"(?P<url>(.*))\"(\s+exceptions\=\"(?P<exceptions>([^\"]*))\"\s+error\=\"(?P<error>([^\"]*))\"\s+(reputation\=\"(?P<reputation_opt>([^\"]*))\"\s+)?category\=\"(?P<category>([^\"]*))\"\s+reputation\=\"(?P<reputation>([^\"]*))\"\s+categoryname\=\"(?P<categoryname>([^\"]*))\"\s+(content-type\=\"(?P<content_type>([^\"]*))\")?)?')

f  = open("sophos-httpproxy.out", "r")
fw = open("sophosfilter.log", "w+")

HttpProxyCount = 0
otherCount = 0

for line in f.readlines():
    HttpProxy = re.search(httpproxy515139, line)
    HttpProxy.groupdict()

    print "AV Field: "
    print "Date/Time: " + str(HttpProxy.groupdict()['categoryname'])
以下是完整的正则表达式:

p\w\w\w\w\w\w\w\w\w\w\w\w\s\d\d\d\d\d\d\d\d\d\p\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w\w+srcip\=?p[^\]*\\s+dstip\=?p[^\]*\\s+user\=?p[^\]*\\s+statuscode\=?p[^\]*\\s+cached\=?p[^\]*\\s+profile\=?p[^\]*\\s+filteraction\=?P[^\]*\\s+size\=?P[^\]*\\s+request\=?P[^\]*\\s+url\=?P.*\\s+exceptions\=?P[^\]*\\s+error\=?P[^\]*\\s+?category\=?P[^\]*\\s+reputation\=?P[^\]\\\\\\\\\\s+categoryname\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

以下是一个示例输入:

2013年10月7日13:22:55 192.168.10.2:10:07-13:22:54 httpproxy[15359]:id=0001 severity=info sys=SecureWeb sub=http name=http访问操作=pass method=GET srcip=192.168.8.47 dstip=64.94.90.108 user=statuscode=200 cached=0 profile=REF\u DefaultHTTPProfile默认代理过滤器操作=REF\u defaulthttpc默认内容过滤器操作大小=1502请求=0x10870200网址=http://www.concordmonitor.com/csp/mediapool/sites/dt.common.streams.StreamServer.cls?STREAMOID=6rXcvJGqsPivgZ7qnO$Sic$daE2N3K4ZzOUsqbU5sYvZF78hLWDhaM8n_FuBV1yRWCsjLu883Ygn4B49Lvm9bPe2QeMKQdVeZmXF$9l$4UCZ8QDxHAH3RJXRJFDY0KQPHLOMEVCTLO3H8XH70Y6N_U CryoSW6; jpQ-&内容类型=图像/jpeg异常=错误=类别=134信誉=中立categoryname=一般新闻内容类型=图像/jpeg

我正在试图捕获整个日志


然而,有时url中有许多引号,这使事情变得混乱。此外,在某些日志中,错误和信誉之间还有一个额外的信誉数据字段。内容类型也不总是出现。有时url数据字段之后的所有内容也会丢失。这就是为什么我添加了所有可选的?。我试图考虑这些情况,并在必要时不打印任何内容。

让我们将正则表达式分成两部分:

....url\=\"(?P<url>(.*))\"

第一部分中的*是贪婪的。它将尽可能匹配所有内容,只有在绝对必要时才进行回溯

第二部分是一个巨大的可选组

当正则表达式执行时,.*将匹配字符串末尾的所有内容,然后根据需要回溯,直到\可以匹配引号。这将是字符串中的最后一个引号,它可能不是您想要的

然后,巨人可选组将尝试匹配,但由于贪婪的。*已经吃掉了巨人可选组应该解析的所有内容,因此它将失败。因为它是可选的,所以正则表达式算法也可以


解决这个问题?好吧,非贪婪量词可能有助于解决眼前的问题,但更好的解决方案可能是停止尝试使用正则表达式来解析这个问题。查找适用于您的数据格式的现有解析器。您是否试图从HTML或XML中提取数据?我已经看到了很多关于的建议。

让我们将正则表达式分成两部分:

....url\=\"(?P<url>(.*))\"

第一部分中的*是贪婪的。它将尽可能匹配所有内容,只有在绝对必要时才进行回溯

第二部分是一个巨大的可选组

当正则表达式执行时,.*将匹配字符串末尾的所有内容,然后根据需要回溯,直到\可以匹配引号。这将是字符串中的最后一个引号,它可能不是您想要的

然后,巨人可选组将尝试匹配,但由于贪婪的。*已经吃掉了巨人可选组应该解析的所有内容,因此它将失败。因为它是可选的,所以正则表达式算法也可以


解决这个问题?好吧,非贪婪量词可能有助于解决眼前的问题,但更好的解决方案可能是停止尝试使用正则表达式来解析这个问题。查找适用于您的数据格式的现有解析器。您是否试图从HTML或XML中提取数据?我已经看到了很多关于的建议。

下次您想要编写这样的正则表达式时,请使用详细模式。如果您不给我们一些示例输入,那么我们就很难想象您的输入可以以各种不同的方式显示,以及如何与您的regexp一起工作。如果您只给我们示例输入、所需输出和实际输出,我们就可以调试它。@user2357112不确定如何在详细模式sorr下编写
y=/compile和其他使用regex的函数也使用flags参数。指定为标志允许您在正则表达式中使用空格和注释,并让正则表达式解析器忽略它们。你需要避开任何你想要匹配的空白,但是这是一个很小的代价,因为你不需要把所有的东西都混合在一起。如果您不给我们一些示例输入,那么我们就很难想象您的输入可以以各种不同的方式显示,以及如何与您的regexp一起工作。如果您只给我们示例输入、所需输出和实际输出,我们可以调试它。@user2357112不确定如何在详细模式下编写抱歉=/compile和其他使用regex的函数也使用flags参数。指定为标志允许您在正则表达式中使用空格和注释,并让正则表达式解析器忽略它们。你需要避开任何你想要匹配的空白,但这是一个小代价,因为你不必把所有的东西都混在一起。