【问题标题】:python regex pattern to extract value between two characterspython正则表达式模式提取两个字符之间的值
【发布时间】:2012-10-03 23:50:32
【问题描述】:

我正在尝试以

的形式从 url 中提取 id 号
http://www.domain.com/some-slug-here/person/237570
http://www.domain.com/person/237570

这些网址中的任何一个也可以有参数

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\/)(.*)(?=\??*)

我看到的是它正在获取 237570 但包括 ?以及 url 中紧随其后的字符。当您点击 ?、/ 或字符串末尾时,我怎么能说停止捕获?

【问题讨论】:

  • 感谢 d3t0n4t0 和 m.buettner - 我应该包括 id 可以是字母数字,例如 /person/35004902B839ABA2 我将 (.*) 更改为 (\w{1,}),效果很好!

标签: python regex url


【解决方案1】:

字符串:

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

正则表达式:

person\/(\d{1,})

输出:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • ..或者贪婪,也许:(.*?)
    • 是的,这也应该有效。但我发现将数字与.* 匹配并不是很优雅。应尽可能限制正则表达式以避免意外的特殊情况。当然,你仍然可以在数字版本中添加不贪婪的?,但不再需要了。
    • 同意。我只是想得更广泛,忽略了数字要求。感谢您的更正顺便说一句。我不知道为什么我写贪婪而不是贪婪:)
    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 2012-05-30
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多