如何用正则表达式提取指定URL中的目标纯数字?
解决URL中提取指定数字的正则问题
问题分析
你需要从两种格式的URL中提取79084和64931这两个纯数字,同时排除/t/路径片段,之前的正则因为贪婪匹配的问题没能得到预期结果。
正确正则方案
方案1:精准匹配固定结构(推荐)
针对你的URL固定结构https://sub.example.com/数字/t/数字[?参数],可以用带捕获组的正则直接定位两个数字:
sub\.example\.com\/(\d+)\/t\/(\d+)
- 解释:
(\d+)会分别捕获域名后的第一个数字,以及/t/后面的第二个数字,不管URL末尾有没有参数,都能精准提取。
代码示例(Python):
import re urls = [ "https://sub.example.com/79084/t/64931?Url=https%3a%2f%2fwww.test.com%2fpath%2fotherpath%2f", "https://sub.example.com/79084/t/64931" ] pattern = r"sub\.example\.com\/(\d+)\/t\/(\d+)" for url in urls: match_result = re.search(pattern, url) if match_result: target_nums = [match_result.group(1), match_result.group(2)] print(target_nums) # 输出 ['79084', '64931']
方案2:全局匹配目标位置的数字
如果URL结构存在小范围变动,但数字始终在sub.example.com/之后和/t/之后,可以用正向断言全局匹配:
(?<=sub\.example\.com\/)\d+|(?<=\/t\/)\d+
- 解释:
(?<=sub\.example\.com\/)确保匹配的数字在域名之后,(?<=\/t\/)确保数字在/t/之后,|表示或逻辑,全局匹配即可拿到两个目标数字。
代码示例(Python):
import re urls = [ "https://sub.example.com/79084/t/64931?Url=https%3a%2f%2fwww.test.com%2fpath%2fotherpath%2f", "https://sub.example.com/79084/t/64931" ] pattern = r"(?<=sub\.example\.com\/)\d+|(?<=\/t\/)\d+" for url in urls: target_nums = re.findall(pattern, url) print(target_nums) # 输出 ['79084', '64931']
之前正则的问题
你使用的(?<=\/sub.example.com\/)(.*)(?=\?[Uu]rl|$)中,.*是贪婪匹配模式,会把79084/t/64931整个字符串全部匹配到,而不是拆分出单独的数字,因此无法得到预期的数字数组。
内容的提问来源于stack exchange,提问作者Ahmet Zeybek
相关产品推荐
相关产品推荐

