为了账号安全,请及时绑定邮箱和手机立即绑定

重复使用相同的前缀来查找下一个匹配项(如果有)

重复使用相同的前缀来查找下一个匹配项(如果有)

HUH函数 2022-10-11 17:06:23
我有这种字符串:string = 'something .... something else ...url="/transfer/packages/00000000-0000-0000-0000-000000000000/connectors/68f74d66-ca3d-4272-9b59-4f737946b3f7/something/138bb190-3b12-4855-88e2-0d1cdf46aeb5/...../...../...../...../...."other things ...'没有任何 CR/LF,都在一条线上。我想创建一个正则表达式:当且仅当 url 以/transfer/packages/捕获每个后续 GUID直到引用字符串的结尾"要找到的 GUID 的数量是未知的,并且至少是一个到目前为止,我写道:\/transfer\/packages\/[^"]*([A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12})"但它只捕获 LAST guid。我需要一些如何重用前缀/transfer/packages/并保持匹配,每次都热切地扩展搜索,而不是从前缀继续。
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

如果您re在 Python 中使用模块,则可以使用str.startwith并尝试:


import re

url="/transfer/packages/00000000-0000-0000-0000-000000000000/connectors/68f74d66-ca3d-4272-9b59-4f737946b3f7/something/138bb190-3b12-4855-88e2-0d1cdf46aeb5/...../...../...../...../...."

if url.startswith('/transfer/packages/'):

    Guid_List = re.findall(r'(?i)[a-z0-9]{8}(?:-[a-z0-9]{4}){3}-[a-z0-9]{12}', url)

print(Guid_List)


查看完整回答
反对 回复 2022-10-11
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

您可以使用支持无限长度量词的PyPi 正则表达式模块

(?<=url="/transfer/packages/[^\r\n"]*)[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}(?=[^\r\n"]*")

示例正则表达式演示(为演示目的选择了另一个引擎)或查看Python 演示


另一种选择是首先匹配url="/transfer/packages/后面跟着一个 guid 的行并匹配到下一个双引号。

然后,您可以使用例如re.findall来获取所有指南。

"/transfer/packages/[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}[^"\r\n]*"

正则表达式演示Python 演示

例如:

import re


regex = r'"/transfer/packages/[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}[^"\r\n]*"'

test_str = ("something .... something else ...\n"

    "url=\"/transfer/packages/00000000-0000-0000-0000-000000000000/connectors/68f74d66-ca3d-4272-9b59-4f737946b3f7/something/138bb190-3b12-4855-88e2-0d1cdf46aeb5/...../...../...../...../....\"\n"

    "other things ...\n\n"

    "68f74d66-ca3d-4272-9b59-4f737946b300")


for str in re.findall(regex, test_str):

    print(re.findall(r"[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}", str))

输出


['00000000-0000-0000-0000-000000000000', '68f74d66-ca3d-4272-9b59-4f737946b3f7', '138bb190-3b12-4855-88e2-0d1cdf46aeb5']



查看完整回答
反对 回复 2022-10-11
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

从这个 SO答案

至于第二个问题,这是一个普遍的问题。使用 PCRE 正则表达式不可能获得任意数量的捕获,因为在重复捕获的情况下,只有最后一个捕获的值存储在组缓冲区中。结果数组中的子匹配数不能多于正则表达式模式内的捕获组数。有关更多详细信息,请参阅重复捕获组与捕获重复组。


查看完整回答
反对 回复 2022-10-11
  • 3 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信