【发布时间】:2019-12-31 14:35:45
【问题描述】:
我有 url 字符串,例如:
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/"
现在,我需要捕获slide_3 部分,更具体地说,是数字3 的起始位置,限制它应该是一个数字(既不能在任何数字之前也不能在任何数字之后)前面没有“= ”。所以,pageid=2 不应该匹配,而 slide_3 应该匹配。
我用 python 正则表达式试过这个:
p = re.compile('/.*(?<!=)(?<!\d)\d(?!\d).*/')
s = "https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/"
for m in p.finditer(s):
print(m.start(), m.group())
结果是
6 //facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/
我明白为什么我得到这个,第一个和最后一个“/”满足正则表达式,但子字符串“/slide_3/”也是如此。
如何确保获得与正则表达式匹配的 smallest 子字符串。
为什么这不起作用:
'/[^/](?<!=)(?<!\d)\d(?!\d).*/'
非贪婪运算符 .*? 似乎无法解决问题,因为它不能保证最短的匹配。
应该匹配的字符串:
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_3/"
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/sno3/"
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/3/"
并且匹配应该分别是 slide_3 , sno3, 3
不应该出现的字符串:
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide/"
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/slide_33/"
"https://facty.com/ailments/body/10-home-remedies-for-styes/pageid=2/33/"
【问题讨论】:
-
这里使用正则表达式有什么意义?
-
@OlvinRoght 我有多个这样的网址,可能包含也可能不包含上述模式。我需要找到那些做并进一步操纵它们的人
-
如果我猜对了,模式是
\w_(\d)?在下划线之后且没有任何数字之后 -
如果匹配
^.*?\/slide_\d\/?$然后做你的事。