![](/img/trans.png)
[英]Python Regex: How to extract string between parentheses and quotes if they exist
[英]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.