具有多个组的python正则表达式子模式中优先的空字符串
据我所知,具有多个组的python正则表达式子模式中优先的空字符串,python,regex,python-2.7,python-3.x,Python,Regex,Python 2.7,Python 3.x,据我所知,|交替尝试不同的子模式,并匹配第一个可能的选项。每当有多个组时,当其中一个子模式为空并赋予其优先级时,后面的组会意外地行为 示例:re.search(((ab | a |).*(as | a |).*(qwe | qw |);“abcde asdfg qwerty”).groups()返回:('ab','') 如果删除空选项re.search(((ab | a |).*(qwe | qw)”,“abcde asdfg qwerty”).groups()结果是('ab','as','qw
|
交替尝试不同的子模式,并匹配第一个可能的选项。每当有多个组时,当其中一个子模式为空并赋予其优先级时,后面的组会意外地行为
示例:re.search(((ab | a |).*(as | a |).*(qwe | qw |);“abcde asdfg qwerty”).groups()
返回:('ab','')
如果删除空选项re.search(((ab | a |).*(qwe | qw)”,“abcde asdfg qwerty”).groups()
结果是('ab','as','qwe')
我对实现第二个结果的方法感兴趣,能够匹配像abc qwerty
这样的字符串,并获得('ab','qwe')
或abc asd
,并获得('ab','as','','')
关于为什么这些模式没有像我预期的那样工作的解释将受到赞赏,但这不是我主要关心的问题。提前谢谢 你得到中间群体的原因是
*
贪婪。它会看到字符串中的所有字符并使用它们
你可能想要这样的东西:
(ab | a |).*(as | a |).*(qwe | qw |)
如果你能准确地发布你需要的东西,可能会更有帮助。我不确定这可能是什么用例,也不确定是否有更好的方法来编写这个正则表达式。得到中间组的原因是
*
是贪婪的。它会看到字符串中的所有字符并使用它们
你可能想要这样的东西:
(ab | a |).*(as | a |).*(qwe | qw |)
如果你能准确地发布你需要的东西,可能会更有帮助。我不确定这可能是什么用例,也不确定是否有更好的方法来编写这个正则表达式。得到中间组的原因是
*
是贪婪的。它会看到字符串中的所有字符并使用它们
你可能想要这样的东西:
(ab | a |).*(as | a |).*(qwe | qw |)
如果你能准确地发布你需要的东西,可能会更有帮助。我不确定这可能是什么用例,也不确定是否有更好的方法来编写这个正则表达式。得到中间组的原因是
*
是贪婪的。它会看到字符串中的所有字符并使用它们
你可能想要这样的东西:
(ab | a |).*(as | a |).*(qwe | qw |)
如果你能准确地发布你需要的东西,可能会更有帮助。我不确定这可能是什么用例,也不确定是否有更好的方法来编写正则表达式。您的问题的原因是贪婪和空令牌的结合。原因是当模式开始时,它会很高兴地匹配字符串开头的
ab
。因此,第一个标记已满足。现在下一个标记是贪心点。这将消耗目标字符串中的所有剩余字符。这满足了这个标记。下一个标记是替代标记。由于贪心点的存在,前两个选项都无法匹配,因为您位于目标字符串的末尾。但是,空令牌可以很容易地匹配。这让整个团队都感到满意。下一个标记是另一个贪婪的点。但是,此点要求任何字符的出现次数为零或更多。由于您位于字符串的末尾(因为第一个贪心点),所以这个标记非常满意。最后一个标记的行为和结果与前面描述的组相同。因此,最后一个代币也很满足。问题的原因是贪婪和空代币的结合。原因是当模式开始时,它会很高兴地匹配字符串开头的ab
。因此,第一个标记已满足。现在下一个标记是贪心点。这将消耗目标字符串中的所有剩余字符。这满足了这个标记。下一个标记是替代标记。由于贪心点的存在,前两个选项都无法匹配,因为您位于目标字符串的末尾。但是,空令牌可以很容易地匹配。这让整个团队都感到满意。下一个标记是另一个贪婪的点。但是,此点要求任何字符的出现次数为零或更多。由于您位于字符串的末尾(因为第一个贪心点),所以这个标记非常满意。最后一个标记的行为和结果与前面描述的组相同。因此,最后一个代币也很满足。问题的原因是贪婪和空代币的结合。原因是当模式开始时,它会很高兴地匹配字符串开头的ab
。因此,第一个标记已满足。现在下一个标记是贪心点。这将消耗目标字符串中的所有剩余字符。这满足了这个标记。下一个标记是替代标记。由于贪心点的存在,前两个选项都无法匹配,因为您位于目标字符串的末尾。但是,空令牌可以很容易地匹配。这让整个团队都感到满意。下一个标记是另一个贪婪的点。但是,此点要求任何字符的出现次数为零或更多。由于您位于字符串的末尾(因为第一个贪心点),所以这个标记非常满意。最后一个标记的行为和结果与前面描述的组相同。因此,最后一个代币也很满足。问题的原因是贪婪和空代币的结合。原因是当模式开始时,它会很高兴地匹配字符串开头的ab
。因此,第一个标记已满足。现在下一个标记是贪心点。这将消耗目标字符串中的所有剩余字符。这令人满意
re.match('^(ab|a|)\w*\s*(?:(as|a)\w*|)\w*?\s*(qwe|qw|)',s) #s is your string
>>> s = 'abasdf asdf qwert'
>>> re.match('^(ab|a|)\w*\s*(?:(as|a)\w*|)\w*?\s*(qwe|qw|)',s).groups()
('ab', 'as', 'qwe')
>>> s = 'abab asf qwert'
>>> re.match('^(ab|a|)\w*\s*(?:(as|a)\w*|)\w*?\s*(qwe|qw|)',s).groups()
('ab', 'as', 'qwe')
>>> s = 'abab qwert'
>>> re.match('^(ab|a|)\w*\s*(?:(as|a)\w*|)\w*?\s*(qwe|qw|)',s).groups()
('ab', None, 'qwe')
>>> s = 'abab asfq'
>>> re.match('^(ab|a|)\w*\s*(?:(as|a)\w*|)\w*?\s*(qwe|qw|)',s).groups()
('ab', 'as', '')