Python,递归地应用regex负前瞻

2024-05-08 19:38:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,我试图通过将用户定义的regex表达式解析为自定义regex表达式来实现它。然后将此自定义正则表达式应用于指定空格的字符串。其思想是在第二列上应用用户regex,而不使用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)

注意:第一个括号内的表达式不能更改(因为它是从用户输入解析的),所以\/\/streams\/gta.*必须保持原样。你知道吗

如何改善负面展望以获得预期结果?你知道吗


Tags: 用户reclientnonestreamserver表达式util
2条回答

您可以使用:

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

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

希望这是清楚的,看看文档(https://docs.python.org/2/library/re.html#contents-of-module-re),如果不是。你知道吗

顺便说一句,你不必转义/,它不是一个特殊的字符。 如果不使用^或$,那么使用re.M标志是没有用的。你知道吗

编辑:由于你的编辑,如果你不想赶上发展,一些信息成为无用的。你知道吗

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

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

编辑3:见评论。你知道吗

https://regex101.com/上测试,这应该可以完成所有第2列的工作:

(?:\w+\s([^\s]+)\s.*[\n|\n\r]*)

仅适用于GTAs第2列:

(?:\w+\s(\/\/streams\/gta[^\s]*)\s.*[\n|\n\r]*)

对于一行,它就像(第二列):

\w+\s([^\s]+)\s.*

Gta仅适用于1条生产线:

\w+\s(\/\/streams\/gta[^\s]*)\s.*

相关问题 更多 >