我有这个格式奇怪的网址。我必须在'()'中提取内容。
示例网址:http://sampleurl.com/(K(ThinkCode))/profile/view.aspx
如果我能从中提取ThinkCode
,我将是一个快乐的人!我正在艰难时期使用像'('和'/'这样的特殊字符。
答案 0 :(得分: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(
。请注意,我们必须转义括号(通过将\
放在它们前面),否则正则表达式解析器会认为它们是正则表达式的一部分而不是匹配的字符!
最后,当你在正则表达式世界中放置方括号时,它意味着“这里的任何字符都可以”。如果你在第一个字符为^
的方括号内放置一些东西,则意味着“这里的任何字符不都可以”。所以[^\)]
表示“任何不是右括号的字符”,而[^\)]*
表示“尽可能多的字符不是右括号”。
全部放在一起,(?<=\(K\()[^\)]*
表示“匹配尽可能多的不是右括号的字符,前面是字符串(K(
。
哦,最后一件事。因为\
表示Python 中的字符串以及正则表达式内部的内容,我们使用原始字符串 - r"spam"
而不是"spam"
。这告诉Python忽略\
的。
如果lookbehind对您来说有点复杂,您还可以使用捕获组。这背后的想法是正则表达式匹配模式,但也可以记住子模式。这意味着您不必担心环视,因为您可以匹配整个模式,然后只提取其中的子模式!
要捕获一个组,只需将其放在括号内:(foo)
将捕获foo
作为第一组。然后,使用.groups()
吐出您匹配的所有群组!这是其他答案的工作方式。
答案 1 :(得分: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""
原始字符串来保留正则表达式模式字符串中的反斜杠。
答案 2 :(得分:0)
如果您想在正则表达式中使用特殊字符,则需要将其转义,例如\(
,\/
,\\
。
匹配嵌套括号内的东西对正则表达式来说有点痛苦。如果该格式始终相同,您可以使用:
\(.*?\((.*?)\).*?\)
基本上:找到一个开放的paren,匹配角色,直到你找到另一个开放的paren,组合角色,直到我看到一个紧密的paren,然后确保在那里有两个更近的paren。
答案 3 :(得分:0)
mystr = "http://sampleurl.com/(K(ThinkCode))/profile/view.aspx"
import re
re.sub(r'^.*\((\w+)\).*',r'\1',mystr)