python正则表达式模式提取两个字符之间的值

python正则表达式模式提取两个字符之间的值,python,regex,url,Python,Regex,Url,我试图从URL中提取一个id号,格式为 http://www.domain.com/some-slug-here/person/237570 http://www.domain.com/person/237570 这些URL中的任何一个都可能有参数 http://www.domain.com/some-slug-here/person/237570?q=some+search+string http://www.domain.com/person/237570?q=some+search+st

我试图从URL中提取一个id号,格式为

http://www.domain.com/some-slug-here/person/237570
http://www.domain.com/person/237570
这些URL中的任何一个都可能有参数

http://www.domain.com/some-slug-here/person/237570?q=some+search+string
http://www.domain.com/person/237570?q=some+search+string
我尝试了以下表达式从上述url中捕获“237570”的id值,但每种表达式都可以工作,但在所有四种url场景中都可以工作

(?<=person\/)(.*)(?=\?)
(?<=person\/)(.*)(?=\?|\z)
(?<=person\/)(.*)(?=\??*)

(?不要使用
*
来匹配ID。
将匹配任何字符(换行符除外,除非使用DOTALL选项)。只需匹配一组数字:
(.*)
-->
(\d+)
字符串:

http://www.domain.com/some-slug-here/person/1234?q=some+search+string
http://www.domain.com/person/3456?q=some+search+string
http://www.domain.com/some-slug-here/person/5678
http://www.domain.com/person/7890
Regexp:

person\/(\d{1,})
输出:

>>> regex.findall(string)
[u'1234', u'3456', u'5678', u'7890']

…或者贪婪的人,也许:
(*)
是的,这也应该行。但是我发现将一个数字与
*
匹配并不是很优雅。人们应该尽可能地限制正则表达式,以避免意外的特殊情况。当然,你仍然可以将ungreedy
添加到数字版本中,但不再需要了。同意。我只是想得更广泛一些,ignor我不知道为什么我写贪婪而不是ungreedy:)谢谢d3t0n4t0和m.buettner-我应该包括ID可以是字母数字的,比如/person/35004902B839ABA2。我把
(.*)
改为
(\w{1,})
,效果很好!