零或一个量词(`?`)似乎并不贪心

时间:2015-05-15 10:25:11

标签: python regex

鉴于这两个测试字符串:

'eitherxory.'
'justy.'

我想匹配' x' (或者没有,如果' x'不存在)和' y'分别:

('x', 'y')
(None, 'y')

我提出的模式是(x)?.*?(y),但匹配是:

(None, 'y')
(None, 'y')

我做错了什么?

我使用的是Python(import re; re.search(pattern, line).groups()),但问题实际上是通用的。

1 个答案:

答案 0 :(得分:2)

一种选择是使用:

(?:(x).*)?(y)

如果我们找到.*,我们只想匹配x,因此我们可以将它们组合在一起并将可选的量词移到外面。这避免了.*从字符串开头占用所有字符的情况。

请注意,如果x出现在字符串中的y之后,这将无法奏效。为此你可以使用这样的东西:

(?=.*(x)).*(y)