2010-10-20 50 views
0

假设你有一些这个字符串(一行)正则表达式 - 测试如果一个字符串包含另一个字符串

10.254.254.28 - - [06/8/2007:00:12:20 -0700]“ GET /keyser/22300/HTTP/1.0“302 528” - “ ”Mozilla/5.0(X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0 .0.4“

并且您想提取GET和HTTP(即某个url)之间的部分,但前提是它包含单词'puzzle'。你如何使用Python中的正则表达式来做到这一点?

这是我迄今为止的解决方案。

match = re.search(r'GET (.*puzzle.*) HTTP', my_string)

它的工作原理,但我想到的东西,我必须要改变第一/第二/为了他们是非贪婪既.*.*?。在这种情况下它确实重要吗?

+0

只是希望你的服务器的管理员不更改日志格式:) – 2010-10-20 14:35:18

回答

5

无需正则表达式

>>> s 
'10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"' 

>>> s.split("HTTP")[0] 
'10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ ' 

>>> if "puzzle" in s.split("HTTP")[0].split("GET")[-1]: 
... print "found puzzle" 
... 
2

它做的事。用户代理可以包含任何内容。对他们两个使用非贪婪。

+0

在其目前的形式,它的事项,如果会有不止一个GET-HTTP字符串单行至极,我怀疑有过将会。尽管让它变得非贪婪,那将是更安全的选择。 – 2010-10-20 13:57:44

1
>>> s = '10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"' 
>>> s.split()[6] 
'/keyser/22300/' 
+0

日志消息在两条破折号之间有时会有非空白内容,这会导致分割中的索引。 – PaulMcG 2010-10-20 14:51:55

+0

如果声明无法解决,那么没有什么不重要的 – SilentGhost 2010-10-20 15:16:09

相关问题