繁体   English   中英

具有多个组的python regex子模式中的空字符串优先

[英]Empty string taking precedence in python regex subpatterns with multiple groups

据我了解, | 尝试交替使用不同的子模式并匹配第一个可能的选项。 每当有多个组时,当其中一个子模式为空时,后一组会表现出异常。

示例: re.search("(ab|a|).*(as|a|).*(qwe|qw|)", "abcde asdfg qwerty").groups()返回:( ('ab', '', '')

如果删除了空选项,则re.search("(ab|a|).*(as|a).*(qwe|qw)", "abcde asdfg qwerty").groups()结果为('ab', 'as', 'qwe')

我对实现第二个结果并能够匹配abc qwerty类的字符串并获取('ab', '', 'qwe')abcd asd并获取('ab', 'as', '')

可以理解为什么这些模式不能按我预期的那样工作,但这不是我的主要关注。 提前致谢!

您得到中间组是.*是贪婪的。 它会看到字符串中的所有字符并使用所有字符。

您可能想要这样的东西:

(ab|a|).* ?(as|a|).* (qwe|qw|)

如果您确切发布了所需内容,则可能会更有帮助。 我不确定这可能是什么用例,以及是否有更好的方式编写该正则表达式。

问题的原因是贪婪和空令牌的结合。 原因是当模式开始时,它将很高兴地与字符串开头的ab匹配。 因此,第一个令牌得到满足。 现在,下一个标记是贪婪的点。 这将消耗目标字符串中的所有其余字符。 这满足该令牌。 下一个标记是交替。 前两个选项都无法匹配,因为贪婪的点使您位于目标字符串的末尾。 但是,空令牌可以轻松匹配。 这满足了整个团队。 下一个标记是另一个贪心点。 但是,此点要求零次或多次出现任何字符。 由于您位于字符串的末尾(因为第一个贪心的点),因此可以轻松满足此标记。 最终令牌的行为和结果与前面描述的组相同。 因此,再次满足这个最终标记。

re.match('^(ab|a|)\w*\s*(?:(as|a)\w*|)\w*?\s*(qwe|qw|)',s) #s is your string

这是我能想到的最好的。 正如肯尼思·K。(Kenneth K.)所说,在匹配空匹配项时,贪婪标记和非贪婪标记存在一种琐碎的组合。 解决的办法是不使用.* ,因此很容易就吃掉了路径中的所有内容。 相反,这实际上将寻找下一个单词并在可能的情况下进行匹配,如果不能则通过。

您想要的内容和我拥有的内容之间的唯一区别应该是,不是空白字符串,如果第二个('as | a')字符串不存在,则该对象将为None而不是''但是您可以解决这个问题

测试:

>>> 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', '')

您还可以使用re.match('^(ab|a|)\\w*\\s*(?:(as|a)\\w*|)\\w*?\\s*(?:(qwe|qw)\\w*|)',s).groups()如果你想第三个元素调高None如果不是有作为。

注意:如果您想将as或qwe词作为第一个词匹配,我认为这不会起作用。 我仍在努力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM