繁体   English   中英

Python:正则表达式提取括号之间找到的部分 URL

[英]Python: Regex to extract part of URL found between parentheses

我有这个格式奇怪的 URL。 我必须提取“()”中的内容。

示例网址: http://sampleurl.com/(K(ThinkCode))/profile/view.aspx : http://sampleurl.com/(K(ThinkCode))/profile/view.aspx

如果我能从中提取出ThinkCode ,我将是一个幸福的人! 我在正则表达式“(”和“/”等特殊字符时遇到了困难。

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

解释

在正则表达式的世界中,一个回顾后是说:“我想匹配的方式ham ,但只有当它是由前面spam 。我们写为(?<=spam)ham 。所以在这种情况下,我们要匹配[^\\)]* ,但前提是它前面有\\(K\\(

现在\\(K\\(是一个很好的,简单的正则表达式,因为它是纯文本!这意味着,精确匹配字符串(K( 。注意我们必须转义括号(通过将\\放在它们前面),否则正则表达式解析器会认为它们是正则表达式的一部分,而不是要匹配的字符!

最后,当您在 regex-world 中将某些内容放在方括号中时,这意味着“此处的任何字符都可以”。 如果你把一些东西放在方括号里,第一个字符是^ ,这意味着“任何不在此处的字符都可以”。 所以[^\\)]表示“任何不是右括号的字符”,而[^\\)]*表示“尽可能多的不是右括号的字符”。

把它们放在一起, (?<=\\(K\\()[^\\)]*意味着“匹配尽可能多的不是右括号的字符,前面是字符串(K( .

哦,最后一件事。 因为\\表示Python 中的字符串以及正则表达式中的某些内容,所以我们使用原始字符串 - r"spam"而不仅仅是"spam" 这告诉 Python 忽略\\

其它的办法

如果lookbehind 对你来说有点复杂,你也可以使用捕获组 这些背后的想法是正则表达式匹配模式,但也可以记住子模式。 这意味着您不必担心环视,因为您可以匹配整个模式,然后只需提取其中的子模式!

要捕获一个组,只需将它放在括号内: (foo)将捕获foo作为第一组。 然后,使用.groups()吐出您匹配的所有组! 这是另一个答案的工作方式。

这并不太难,特别是因为/实际上并不是 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM