正则表达式中的大可选块

时间:2014-01-27 18:54:22

标签: python regex

我有一个正则表达式

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>([^\"]*))\")?

然而,有时在我的日志文件中捕获url\=\"(?P<url>((.*)))\"之后的所有内容有时都是可选的,因此我决定在(...)?之后的所有内容周围添加url\=\"(?P<url>((.*)))\"。然而,这并不是我想做的事情。我希望捕获整个日志,并且不包含url...之后的所有内容。

这是我的正则表达式()?围绕可选块

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>([^\"]*))\")?)?

以下是我感兴趣的示例日志条目的一部分:

url="http://media.fastclick.net/w/get.media?sid=15971&tp=5&d=j&t=n" exceptions="" error="" category="178" reputation="unverified" categoryname="Internet Services" content-type="application/x-javascript"

2 个答案:

答案 0 :(得分:1)

我将所有组都设为可选,我删除了不必要的捕获组和转义字符:

(?x)   # to allow line break, comments in the regex
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>[^\"]*)\")?

答案 1 :(得分:0)

我遗漏的是?

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

以下是答案

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

?帮助.*非贪婪