繁体   English   中英

从网址中提取uuid

[英]extract uuid from url

我想从网址中提取UUID。

例如:

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

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

我的正则表达式现在是".*\\/posts\\/(.*)[/?]+.*" /(。*)[/ ".*\\/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 ,查询参数,很好。

我错过了什么? 如何使它正确?

谢谢

.*模式对于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格式更加严格,请参见:

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

对您的正则表达式.*\\/posts\\/(.*)[/?]+.* /(。*)[/ .*\\/posts\\/(.*)[/?]+.*的纯英语描述将类似于:

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

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

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

...最大的munch规则要求第二个“任何”匹配都应尽可能长,因此最终匹配得比您想要的要多:

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

...,因为仍有/7034部分剩余,与正则表达式的其余部分匹配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM