2010-10-20 69 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

相關問題