gpt4 book ai didi

Python,递归应用正则表达式负向前瞻

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:20 25 4
gpt4 key购买 nike

在Python中,我试图通过将用户定义的正则表达式解析为自定义正则表达式来实现它。然后将此自定义正则表达式应用于以空格分隔的字符串。这个想法是在第二列上应用用户正则表达式而不使用 for 循环

Stream //streams/sys_util mainline none 'sys_util'
Stream //streams/gta mainline none 'gta'
Stream //streams/gta_client development //streams/gta_cdevelop 'gta_client'
Stream //streams/gta_develop development //streams/gta 'gta_develop'
Stream //streams/gta_infrastructure development //streams/gta 'gta_infrastructure'
Stream //streams/gta_server development //streams/gta_cdevelop 'gta_server'
Stream //streams/0222_ImplAlig1.0 task none '0222_ImplAlig1.0'
Stream //streams/0377_kzo_the_wart task //streams/applications_int '0377_tta'

预期输出应该是

//streams/gta
//streams/gta_client
//streams/gta_develop
//streams/gta_infrastructure
//streams/gta_server

这是我的代码,

import re
mystring = "..."
match_rgx = r'Stream\s(\/\/streams\/gta.*)(?!\s)'
result = re.findall(match_rgx, mystring, re.M)

注意:第一个括号内的表达式无法更改(因为它是从用户输入解析的),因此必须保留 \/\/st​​reams\/gta.*就这样。

如何改进负面预测以获得所需的结果?

最佳答案

您可以使用:

match_rgx = 'Stream\s(//streams/gta.*?)\s'
result = re.findall(match_rgx, mystring)

默认情况下,运算符 * 是贪婪的,因此它将 try catch 尽可能多的文本(例如:“//streams/gta mainline none”将在没有 ? 的情况下匹配)。但你只想要第二列,所以,用 ?你的运算符变得非贪婪,并在最小模式处停止,在这里,在第一次出现\s ("//streams/gta") 时。

希望这很清楚,如果还不清楚,请查看文档 ( https://docs.python.org/2/library/re.html#contents-of-module-re )。

顺便说一句,您不必转义/,它不是特殊字符。如果不使用 ^ 或 $,则使用 re.M 标志是没有用的。

编辑:自从您编辑后,如果您不想 catch 发展,一些信息就变得毫无用处。

编辑2:没看出你不想改变模式。在这种情况下,只需执行以下操作:

match_rgx = 'Stream\s(\/\/streams\/gta.*?)\s'

Edit3:参见评论。

关于Python,递归应用正则表达式负向前瞻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41890366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com