我有這個奇怪的格式化的URL。我必須提取'()'中的內容。Python:正則表達式來提取部分URL之間的圓括號
樣品網址:http://sampleurl.com/(K(ThinkCode))/profile/view.aspx
如果我可以提取ThinkCode
出來,我將是一個快樂的人!我有一個艱難的時間與regexing特殊字符像「(」和「/」。
我有這個奇怪的格式化的URL。我必須提取'()'中的內容。Python:正則表達式來提取部分URL之間的圓括號
樣品網址:http://sampleurl.com/(K(ThinkCode))/profile/view.aspx
如果我可以提取ThinkCode
出來,我將是一個快樂的人!我有一個艱難的時間與regexing特殊字符像「(」和「/」。
>>> 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()
吐出你匹配的所有組!這是其他答案的工作方式。
如果你想在一個正則表達式的特殊字符,你需要轉義,如\(
,\/
,\\
。
嵌套的括號內匹配的東西是相當多的正則表達式痛,如果該格式是永遠不變的,你可以這樣做:
\(.*?\((.*?)\).*?\)
基本上是:找一個開括號,匹配的字符,直到找到另一個開放paren,組角色,直到我看到一個親密paren,然後確保有兩個更多的c在那裏丟失paren。
這並不難,特別是因爲/
實際上並不是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""
原始字符串保持在正則表達式模式字符串中的反斜槓。
mystr = "http://sampleurl.com/(K(ThinkCode))/profile/view.aspx"
import re
re.sub(r'^.*\((\w+)\).*',r'\1',mystr)
請問您能解釋一下這個正則表達式,這個工程很好。我想了解正則表達式的用法和用途。感謝您的快速回復(: – ThinkCode 2010-07-28 18:59:32
當然,兩秒鐘 – katrielalex 2010-07-28 19:02:46
好吧,所以大概十分鐘左右吧!享受!= p – katrielalex 2010-07-28 19:12:02