Python 正则表达式-测试一个字符串是否包含另一个字符串

Python 正则表达式-测试一个字符串是否包含另一个字符串,python,regex,string,Python,Regex,String,假设您有一些字符串(一行) 10.254.254.28--[06/Aug/2007:00:12:20-0700]“获取 /keyser/22300/HTTP/1.0“302 528”-” “Mozilla/5.0(X11;U;Linux i686 (x86_64);欧洲-美国;rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4“ 您希望提取GET和HTTP之间的部分(即某个url),但前提是它包含单词“puzzle”。如何在Python中使用正则表达式实现这一点

假设您有一些字符串(一行)

10.254.254.28--[06/Aug/2007:00:12:20-0700]“获取 /keyser/22300/HTTP/1.0“302 528”-” “Mozilla/5.0(X11;U;Linux i686 (x86_64);欧洲-美国;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)

这是可行的,但我有一个想法,我必须将第一个/第二个/两个
*
更改为
*?
,以使它们不贪婪。在这种情况下它真的重要吗?

不需要正则表达式

>>> 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"
...

这很重要。用户代理可以包含任何内容。对这两个字符串都使用non-greedy。

在其当前形式中,只有在一行中有多个GET-HTTP字符串时才有意义,我怀疑这一行中永远不会有GET-HTTP字符串。不过,将其设置为非贪婪会更安全。只希望您的服务器管理员不会更改日志格式:)日志消息有时在两个破折号之间有非空白内容,这会使拆分中的索引失效。
>>> 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/'