Python 正则表达式 可选非捕获空格
我想要匹配这样的内容:
!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]+) ?(.*)
。你需要的是一个感叹号(!),后面跟着一串字母(这是你的第一个参数),然后可能会有一个空格,接着是另一个可以捕获的部分,这部分可以是空的(也就是可以没有),或者在空格后面有任意字符。