Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配两个几乎相似的字符串(python)_Python_Regex - Fatal编程技术网

匹配两个几乎相似的字符串(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]