【问题标题】:extract uuid from url从url中提取uuid
【发布时间】:2016-09-15 14:05:45
【问题描述】:

我想从 url 中提取 UUID。

例如:

/posts/eb8c6d25-8784-4cdf-b016-4d8f6df64a62?mc_cid=37387dcb5f&mc_eid=787bbeceb2
/posts/d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid/7034
/posts/5ff0021c-16cd-4f66-8881-ee28197ed1cf

我有成千上万的这种字符串。

我的正则表达式现在是".*\/posts\/(.*)[/?]+.*" 这给了我这样的结果:

d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid
84ba0472-926d-4f50-b3c6-46376b2fe9de/uid
6f3c97c1-b877-40e0-9479-6bdb826b7b8f/uid
f5e5dc6a-f42b-47d1-8ab1-6ae533415d24
f5e5dc6a-f42b-47d1-8ab1-6ae533415d24
f7842dce-73a3-4984-bbb0-21d7ebce1749
fdc6c48f-b124-447d-b4fc-bb528abb8e24

如您所见,我的正则表达式无法摆脱​​/uid,而是处理?xxxx,查询参数,很好。

我错过了什么?怎么弄好?

谢谢

【问题讨论】:

标签: python regex


【解决方案1】:

.* 模式对于 UUID 来说过于宽泛和贪婪

>>> import re
>>> data = """
... /posts/eb8c6d25-8784-4cdf-b016-4d8f6df64a62?mc_cid=37387dcb5f&mc_eid=787bbeceb2
... /posts/d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid/7034
... /posts/5ff0021c-16cd-4f66-8881-ee28197ed1cf
... """
>>> 
>>> re.findall(r"/posts/([A-Za-z0-9\-]+)", data)
['eb8c6d25-8784-4cdf-b016-4d8f6df64a62', 
 'd78fa5da-4cbb-43b5-9fae-2b5c86f883cb', 
 '5ff0021c-16cd-4f66-8881-ee28197ed1cf']

或者,您可以对 UUID 格式更严格,查看更多:

【讨论】:

    【解决方案2】:

    正则表达式尝试匹配尽可能多的字符(非正式地称为“maximal munch”)。

    您的正则表达式 .*\/posts\/(.*)[/?]+.* 的简单英文描述将类似于:

    匹配任何内容,然后是/posts/,然后是任何内容,然后是一个或多个/?,然后是任何内容。

    当我们将该正则表达式应用于此文本时:

    .../posts/d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid/7034

    ...最大咀嚼规则要求第二个“任何东西”匹配尽可能长,因此它最终匹配的比你想要的多:

    d78fa5da-4cbb-43b5-9fae-2b5c86f883cb/uid

    ...因为仍然存在 /7034 部分,它与正则表达式的其余部分匹配。

    修复它的最佳方法是使用正则表达式,它匹配 UID 中实际出现的字符(如 @alecxe 所建议的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多