0

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

::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......3-2-WORD2出现了这个-。如何将其添加到\w+?

4

4 回答 4

1

最后一个问题:

[\w\-]+

解释:

\w 匹配任何单词字符。

于 2013-01-09T10:27:40.483 回答
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']

作为对评论的回应,如果“任何事情”都可以,那么使用字符串函数比使用正则表达式更容易:

x, y = a.split('= ', 1)
results = x.split('::')[1:] + [y]
于 2013-01-09T10:22:00.447 回答
0

对于你最后一个问题,你可以做类似的事情(接受字母、数字和“-”)

[a-zA-Z0-9\-]+
于 2013-01-09T10:18:45.433 回答
0

根据 thg435 的答案,您可以拆分为“=”,然后执行完全相同的操作,例如

left,right = a.split('=', 1)
answer = left.split('::')[1:] + [right]
于 2013-01-09T10:48:06.163 回答