2010-07-28 46 views
1

我有這個奇怪的格式化的URL。我必須提取'()'中的內容。Python:正則表達式來提取部分URL之間的圓括號

樣品網址:http://sampleurl.com/(K(ThinkCode))/profile/view.aspx

如果我可以提取ThinkCode出來,我將是一個快樂的人!我有一個艱難的時間與regexing特殊字符像「(」和「/」。

回答

4
>>> foo = re.compile(r"(?<=\(K\()[^\)]*") 
>>> foo.findall(r"http://sampleurl.com/(K(ThinkCode))/profile/view.aspx") 
['ThinkCode'] 

說明

在正則表達式的世界中,一個lookbehind是說:「我想匹配ham的一種方式,但只有如果它是由spam之前,我們寫爲(?<=spam)ham。所以在這種情況下,我們要匹配[^\)]*,但只有當它是由\(K\(之前。

現在\(K\(是一個不錯的,簡單的正則表達式,因爲它是純文本!這意味着,嚴絲合縫串(K(。請注意,我們必須跳過括號(將\放在前面),否則正則表達式解析器會認爲它們是正則表達式的一部分,而不是匹配的字符!

最後,當你在正則表達式中放置了方括號時,這意味着「這裏的任何字符都OK」。如果你在第一個字符是^的方括號內加上了一些東西,這意味着「這裏的任何字符而不是都可以」。所以[^\)]的意思是「任何不是右括號的字符」,[^\)]*的意思是「儘可能多的字符不是右括號」。

全部放在一起,(?<=\(K\()[^\)]*意思是「你可以不在右括號內,串(K(之前匹配儘可能多的字符。

哦,最後一兩件事。因爲\意味着內部串東西在Python以及裏面的正則表達式,我們使用原始字符串 - 。r"spam",而不是僅僅"spam"這告訴Python來忽略\

另一種方式

如果lookbehind對您來說有點複雜,您還可以使用捕獲組。這些背後的想法是,正則表達式匹配模式,但也可以記住子模式。這意味着你不必擔心周圍的問題,因爲你可以匹配整個模式,然後提取其中的子模式!

要捕獲一個組,只需將其放在括號內:(foo)將捕獲foo作爲第一組。然後,使用.groups()吐出你匹配的所有組!這是其他答案的工作方式。

+0

請問您能解釋一下這個正則表達式,這個工程很好。我想了解正則表達式的用法和用途。感謝您的快速回復(: – ThinkCode 2010-07-28 18:59:32

+0

當然,兩秒鐘 – katrielalex 2010-07-28 19:02:46

+0

好吧,所以大概十分鐘左右吧!享受!= p – katrielalex 2010-07-28 19:12:02

0

如果你想在一個正則表達式的特殊字符,你需要轉義,如\(\/\\

嵌套的括號內匹配的東西是相當多的正則表達式痛,如果該格式是永遠不變的,你可以這樣做:

\(.*?\((.*?)\).*?\) 

基本上是:找一個開括號,匹配的字符,直到找到另一個開放paren,組角色,直到我看到一個親密paren,然後確保有兩個更多的c在那裏丟失paren。

1

這並不難,特別是因爲/實際上並不是Python正則表達式中的特殊字符。你只需要反斜槓就可以了。這個怎麼樣:

s = "http://sampleurl.com/(K(ThinkCode))/profile/view.aspx" 
mo = re.match(r"http://sampleurl\.com/\(K\(([^)]+)\)\)/profile.view\.aspx", s); 
print mo.group(1) 

注意使用r""原始字符串保持在正則表達式模式字符串中的反斜槓。

0
mystr = "http://sampleurl.com/(K(ThinkCode))/profile/view.aspx" 
import re 
re.sub(r'^.*\((\w+)\).*',r'\1',mystr) 
相關問題