在文件中,我可以使用以下两种字符串格式之一:
::WORD1::WORD2= ANYTHING
::WORD3::WORD4::WORD5= ANYTHING2
这是我提出的正则表达式:
::(\w+)(?:::(\w+))?::(\w+)=(.*)
regex.findall(..)
[(u'WORD1', u'', u'WORD2', u' ANYTHING'),
(u'WORD3', u'WORD4', u'WORD5', u' ANYTHING2')]
我的第一个问题是,为什么在匹配第一个字符串时会得到这个空u''
?
我的第二个问题是,是否有更简单的方法来编写这个正则表达式?这两个字符串非常相似,除了有时我有额外的::WORD5
我的最后一个问题是:大部分时间我只在::
之间使用了单词,这就是为什么\w+
就足够了,但有时候我可以获得2-WORD2
或{{1}之类的内容等等..出现了这个3-2-WORD2
。如何将其添加到-
?
答案 0 :(得分:1)
捕获的群组总是包含在re.findall
结果中,即使它们不匹配任何内容。这就是你得到一个空字符串的原因。如果您只想了解分隔符之间的内容,请尝试使用split
代替findall
:
a = '::WORD1::WORD2= ANYTHING'
b = '::WORD3::WORD4::WORD5= ANYTHING2'
print re.split(r'::|= ', a)[1:] # ['WORD1', 'WORD2', 'ANYTHING']
print re.split(r'::|= ', b)[1:] # ['WORD3', 'WORD4', 'WORD5', 'ANYTHING2']
回应评论,如果" ANYTHING"可能是好的,任何事情,使用字符串函数而不是正则表达式更容易:
x, y = a.split('= ', 1)
results = x.split('::')[1:] + [y]
答案 1 :(得分:1)
最后一个问题:
[\w\-]+
解释
的
\w
强> 的 匹配任何单词字符。
答案 2 :(得分:0)
对于你的上一个问题,你可以做一些事情(接受字母,数字和“ - ”)
[a-zA-Z0-9\-]+
答案 3 :(得分:0)
根据thg435的答案你可以分成“=”,然后像
一样做同样的事情left,right = a.split('=', 1)
answer = left.split('::')[1:] + [right]