我有这个奇怪的格式化的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