Python 特定字符串后的Regex infine捕获组
我有一个机器人,它接受许多不同的命令,我正在尝试扩展它为所有这些命令获取参数的能力 以下是语法:Python 特定字符串后的Regex infine捕获组,python,regex,Python,Regex,我有一个机器人,它接受许多不同的命令,我正在尝试扩展它为所有这些命令获取参数的能力 以下是语法: !action db_table mandatory_arg arg1 arg2 arg3... 现在,我有一个用于处理命令的功能性但不可扩展的正则表达式: ^!(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)$ 它是有效的,但不是很好,而且它显然仅限于我在其中添加的\s*数量 那么,如何匹配以下字符串中数量不限的参数呢
!action db_table mandatory_arg arg1 arg2 arg3...
现在,我有一个用于处理命令的功能性但不可扩展的正则表达式:
^!(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)$
它是有效的,但不是很好,而且它显然仅限于我在其中添加的\s*数量
那么,如何匹配以下字符串中数量不限的参数呢
!dont match this match1 match2 match3 match4 etc...
我试过使用lookback,但它只适用于第一场比赛。我也尝试将其[^ignore]完全作为第一部分,但这只适用于第一个论点,因为其他人也在寻找特定的忽略
最后,我也给了\K一个机会,但没有成功
!\w+\s\w+\s\w+\s\K(\S*)*
您似乎需要从字符串的开头获取特定模式后的空格分隔参数。您可以捕获该模式之后的任何1+字符,运行
re.search
/re.match
以获取该值,一旦找到匹配项,只需split()
匹配组(1)
正则表达式将被证明是
^!\w+\s+\w+\s+\w+(.+)
或者,将其缩短一点:
^!(?:\w+\s+){3}(.+)
请注意,^
在re.match
中是多余的,默认情况下,模式锚定在字符串的开头。看
见:
实际上,这里不需要正则表达式,只需使用
split()
:
为什么不使用
.split()
?您使用的是PyPi正则表达式库吗?正则表达式无法捕获无限数量的字符串。为什么不在空白处拆分字符串?为什么不这样做:?顺便说一句,\K
在python中不可用:它与文本K
匹配。Quake,请发布您当前的代码。这很好。我仍在学习正则表达式,我希望在一次搜索中就可以实现所有功能,而不必在搜索后使用Python进行清理,但我会接受您的答案。@Quake如果您安装PyPi正则表达式模块,您可以使用1个正则表达式完成所有操作,请参阅。如果我的答案对你有用,请考虑接受答案。
import re
rx = r"!\w+\s+\w+\s+\w+(.+)"
s = "!action db_table mandatory_arg arg1 arg2 arg3"
m = re.match(rx, s)
if m:
print(m.group(1).split())
# => ['arg1', 'arg2', 'arg3']
cmds = ['!action db_table mandatory_arg arg1 arg2 arg3...',
'!dont match this match1 match2 match3 match4 etc...',
'this one not']
new_cmds = [args[3:]
for cmd in cmds
for args in [cmd.split()]
if cmd.startswith('!')]
print(new_cmds)
# [['arg1', 'arg2', 'arg3...'],
# ['match1', 'match2', 'match3', 'match4', 'etc...']]