2010-07-28 71 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)