Python正则表达式提取URL中指定斜杠间的字符串
解决URL路径片段提取问题
正则表达式方案
针对你的需求,推荐使用锚定URL开头的正则表达式,避免匹配到域名等无关内容:
^https?://[^/]+/([^/]+)(?:/([^/]+))?
正则说明:
^https?://:匹配URL开头的http://或https://,确保从URL起始位置开始匹配[^/]+:匹配域名部分(如www.happy.com),直到遇到第三个斜杠/:匹配第三个斜杠([^/]+):第一个捕获组,提取第3-4个斜杠之间的内容(如de、sr、en)(?:/([^/]+))?:可选的非捕获组,内部的/([^/]+)提取第4-5个斜杠之间的内容(如article、forum),?表示该部分可不存在(对应第二个URL的情况)
匹配结果示例:
| URL | 捕获组1(第3-4斜杠内容) | 捕获组2(第4-5斜杠内容) |
|---|---|---|
https://www.happy.com/de/article/98238811/poppers | de | article |
https://www.happy.com/sr | sr | 空 |
https://www.happy.com/en/forum/ocean-liveliness | en | forum |
更可靠的URL解析方案
如果处理大量或复杂URL(带参数、锚点等),用编程语言自带的URL解析工具比正则更稳定,以下是两种常见语言的实现:
Python 示例
from urllib.parse import urlparse urls = [ "https://www.happy.com/de/article/98238811/poppers", "https://www.happy.com/sr", "https://www.happy.com/en/forum/ocean-liveliness" ] for url in urls: parsed_url = urlparse(url) # 拆分路径片段,去掉开头的斜杠 path_segments = parsed_url.path.lstrip('/').split('/') lang_segment = path_segments[0] if path_segments else None section_segment = path_segments[1] if len(path_segments) >= 2 else None print(f"区域片段: {lang_segment}, 板块片段: {section_segment}")
JavaScript 示例
const urls = [ "https://www.happy.com/de/article/98238811/poppers", "https://www.happy.com/sr", "https://www.happy.com/en/forum/ocean-liveliness" ]; urls.forEach(url => { const urlObj = new URL(url); // 拆分路径片段,去掉开头的斜杠 const pathSegments = urlObj.pathname.slice(1).split('/'); const langSegment = pathSegments[0]; const sectionSegment = pathSegments[1] || null; console.log(`区域片段: ${langSegment}, 板块片段: ${sectionSegment}`); });
为什么你的正则不行?
你之前用的[/]*[^/]+[/]([^/]+)没有锚定URL开头,会匹配任意位置的斜杠组合,导致误抓到域名部分(如www.happy)。而锚定开头的正则会跳过协议和域名,直接定位到路径的前两段。
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

