匹配两个几乎相似的字符串(python)
在文件中,我可以使用以下两种字符串格式之一:匹配两个几乎相似的字符串(python),python,regex,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')] 我的第一个问题是,为什么
::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+
中?对于最后一个问题,您可以执行类似(接受字母、数字和“-”)的操作
捕获的组始终包含在
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”可以是,ANYTHING,那么使用字符串函数比使用regexp更容易:
x, y = a.split('= ', 1)
results = x.split('::')[1:] + [y]
关于最后一个问题:
[\w\-]+
说明:
\w
匹配任何单词字符
根据thg435的答案,您可以拆分为“=”,然后执行完全相同的操作,如
left,right = a.split('=', 1)
answer = left.split('::')[1:] + [right]
这个解决方案看起来很简单,但可能有点太简单了,因为WORDx和任何东西之间的区别都是不可能的,任何东西都可能包含任何字符,而不会发生进一步的拆分。我认为这对于Johny19的需要是行不通的。当他说“任何东西”时,它可能会在“任何东西”中得到“:”或“=”,因此也会分解成一个列表。。否则这将是一个优雅的解决方案是的(亚历克西斯和吉多特)。但无论如何还是要感谢thg435,这太聪明了!或者照Ria说的做,那就更好了:p
left,right = a.split('=', 1)
answer = left.split('::')[1:] + [right]