Python: 正则表达式提取括号内的URL部分

1 投票
4 回答
1314 浏览
提问于 2025-04-16 01:58

我有一个格式奇怪的链接,我需要从中提取出括号里的内容。

示例链接:http://sampleurl.com/(K(ThinkCode))/profile/view.aspx

如果我能把ThinkCode提取出来,我就开心了!不过我在用正则表达式处理像'('和'/'这样的特殊字符时遇到了困难。

4 个回答

0

在编程中,有时候我们需要把一些数据从一个地方传到另一个地方。这个过程就像把水从一个水壶倒到另一个水壶一样。我们需要确保水不会洒出来,也就是确保数据在传输过程中不会丢失或出错。

为了实现这个目标,程序员们会使用一些工具和方法来帮助他们。比如,有的程序会把数据分成小块,逐个发送,这样即使有一部分出现问题,也不会影响到其他部分。就像把水分成几杯慢慢倒,而不是一次性倒满一大壶。

另外,程序员们还会使用一些检查机制,确保数据在传输过程中是完整的。这就像在倒水的时候,时不时看看水壶里还有多少水,确保不会倒空。

总之,数据传输就像是一个精细的过程,需要小心翼翼地进行,以确保信息能够安全、准确地到达目的地。

mystr = "http://sampleurl.com/(K(ThinkCode))/profile/view.aspx"
import re
re.sub(r'^.*\((\w+)\).*',r'\1',mystr)
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""原始字符串,这样可以保留正则表达式模式字符串中的反斜杠。

4

解释

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

在正则表达式的世界里,后向查找是一种说法,意思是“我想匹配 ham,但只有在它前面有 spam 的情况下”。我们写作 (?<=spam)ham。所以在这个例子中,我们想匹配 [^\)]*,但前面必须是 \(K\(

现在 \(K\( 是一个简单易懂的正则表达式,因为它就是普通文本!它的意思是,精确匹配字符串 (K(。注意,我们需要在括号前加上 \,因为如果不加,正则解析器会把它们当成正则表达式的一部分,而不是要匹配的字符!

最后,在正则表达式中,放在方括号里的东西意味着“这里面的任何字符都可以”。如果方括号里的第一个字符是 ^,那就表示“这里面没有的字符都可以”。所以 [^\)] 的意思是“任何不是右括号的字符”,而 [^\)]* 的意思是“尽可能多的不是右括号的字符”。

把这些结合起来,(?<=\(K\()[^\)]* 的意思是“匹配尽可能多的不是右括号的字符,前面是字符串 (K(。”

哦,还有最后一点。因为 \Python字符串和正则表达式中都有特殊含义,所以我们使用原始字符串——r"spam" 而不是 "spam"。这样可以告诉Python忽略 \

另一种方法

如果后向查找对你来说有点复杂,你也可以使用捕获组。它的意思是正则表达式可以匹配模式,同时也能记住子模式。这意味着你不需要担心查找,因为你可以匹配整个模式,然后提取里面的子模式!

要捕获一个组,只需把它放在括号里:(foo) 会把 foo 捕获为第一个组。然后,使用 .groups() 来输出你匹配的所有组!这就是另一个答案的工作原理。

撰写回答