Python 正则表达式 可选非捕获空格

0 投票
2 回答
616 浏览
提问于 2025-04-18 15:01

我想要匹配这样的内容:

!argument1 [argument2],其中 argument2 是可选的。我已经用第二个可选组搞定了,但我无法让它忽略参数之间的空格。

我用的正则表达式是:regex="!([a-z]) ?\W(.)"

可以匹配到的例子有:

"!test case"

"!test "

但不能匹配的例子是:

"!test"

我试着在正则表达式里加一个 '?(: )' 来创建一个不捕获的可选组,里面包含空格,但没有成功,结果变成了:regex="!([a-z])?(: )?\W(.)"

结果是 'raise error, v # invalid expression',表示出现了错误,表达式无效。

这是我在 Python 终端里做的一些尝试:

>>>  regex="!([a-z]*) ?\W(.*)"
>>> data="!hello dear"
>>> re.search(regex, data).groups()
('hello', 'dear')
>>> data="!hello "
>>> re.search(regex, data).groups()
('hello', '')
>>> data="!hello"
>>> re.search(regex, data).groups()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'

2 个回答

0

太复杂了。

import re
e = re.compile("(!?\w+)")
s = "!test ing code"
args = e.findall(s)[0][0]
print args

['!test', 'ing', 'code']

然后只需要检查一下 args[0][0] == "!"

我猜这是为了某种机器人,可能是IRC聊天的那种,可以看看phenny。

更简单的方法是先检查你的命令是否以 ! 开头,然后在传给正则表达式解析器之前把它去掉。这样你就可以直接捕获 \w+ 了。

1

评论中的这个正则表达式应该能满足你的需求:!([a-z]+) ?(.*)。你需要的是一个感叹号(!),后面跟着一串字母(这是你的第一个参数),然后可能会有一个空格,接着是另一个可以捕获的部分,这部分可以是空的(也就是可以没有),或者在空格后面有任意字符。

撰写回答