匹配两个几乎相似的字符串(python)

时间:2013-01-09 10:14:38

标签: python regex

在文件中,我可以使用以下两种字符串格式之一:

::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。如何将其添加到-

4 个答案:

答案 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]