Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 特定字符串后的Regex infine捕获组_Python_Regex - Fatal编程技术网

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...']]