使用regex从url中提取子路径

时间:2016-10-08 07:25:35

标签: python regex url

我有这个网址:

 http://www.example.com/en/news/2016/07/17/1207151/%D9%81%D8%AA%D9%88%D8%A7%DB%8C-%D8%B1%D9%87%D8%A8%D8%B1-

我将在这里提取1207151

这是我的正确文本:

pattern = '(http[s]?:\/\/)?([^\/\s]+\/)+[^/]+[^/]+[^/]+[^/]/(?<field1>[^/]+)/'

但这是错的!

我的错误是什么?

3 个答案:

答案 0 :(得分:2)

你可以在python代码中使用这个正则表达式:

>>> url = 'http://www.example.com/en/news/2016/07/17/1207151/%D9%81%D8%AA%D9%88%D8%A7%DB%8C-%D8%B1%D9%87%D8%A8%D8%B1-'
>>> re.search(r'^https?://(?:([^/]+)/){7}', url).group(1)
'1207151'

([^/]+)/){7}将匹配任意非正斜杠中的1个或多个以及/ 7次,这将为我们在捕获的组#1中的最后一场比赛。

答案 1 :(得分:1)

你有几件事情在发生。

首先,您需要正确地逃避所有/。你已经掌握了大部分,但错过了一对夫妇:

(http[s]?:\/\/)?([^\/\s]+\/)+[^\/]+[^\/]+[^\/]+[^\/]\/(?<field1>[^\/]+)\/

从这里,你有一些&#34; 1或更多不是/&#34;连续可以减少:

[^\/]+[^\/]+[^\/]+ ==> [^\/]{3,}

但那不是你想要做的,你的意思是有很多块&#34;非/&#34;然后是&#34; /&#34;并且根据您的示例,在使用命名捕获组之前,您需要6次。

([^\/]+\/){6}

以下是有效的:

http[s]?:\/\/([^\/]+\/){6}(?<field1>[^\/]+)\/

你可以在这里看到它:https://regex101.com/r/kkqwRJ/2

答案 2 :(得分:0)

import re
print re.search(r'.*/([^/]+)/.*',s).group(1)