Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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,试图使用一个相当长的正则表达式,结果是这个小部分与我期望的不匹配 >>> re.search(r'(foo)((?<==)bar)?', 'foo').groups() ('foo', None) >>> re.search(r'(foo)((?<==)bar)?', 'foo=bar').groups() ('foo', None) >>重新搜索(r'(foo)((?为什么不使用: (foo)=?(bar)? 此外,以下表达式似乎更为正确,

试图使用一个相当长的正则表达式,结果是这个小部分与我期望的不匹配

>>> re.search(r'(foo)((?<==)bar)?', 'foo').groups()
('foo', None)

>>> re.search(r'(foo)((?<==)bar)?', 'foo=bar').groups()
('foo', None)

>>重新搜索(r'(foo)((?为什么不使用:

(foo)=?(bar)?
此外,以下表达式似乎更为正确,因为它捕获了完整匹配中的“=”,但您的原始表达式根本没有捕获该值:

(foo).?((?<==)bar)?

(foo)。(?查找后面的目标从未包含在匹配中-它应该用作锚,但实际上不会被正则表达式使用

仅当当前位置前面有目标时,后向查找模式才应匹配。在您的示例中,在匹配字符串中的“foo”后,当前位置位于“=”处,而“=”前面没有“=”—前面有“o”

另一种方法是通过查看和阅读

请注意,以正向lookback断言开头的模式在被搜索字符串的开头永远不会匹配

在匹配
foo
之后,您的查找将尝试在字符串的开头(剩余部分)进行匹配-这将永远不起作用

其他人建议使用正则表达式,这可能会更好地为您服务,但我认为您可能正在寻找

>>> re.search('(foo)(=(bar))?', 'foo=bar').groups()
('foo', '=bar', 'bar')

如果您发现额外的组有点烦人,您可以省略内部的“()”并从匹配的组中删除第一个字符…

您可能只想使用非捕获组
(foo)(?:=(bar))?


lookbehind断言只查看当前位置的左侧,并检查所提供的表达式是否匹配。因此,表达式匹配
foo
,然后检查左侧的输入是否匹配
foo
-中的第二个
o
匹配
=
。这当然总是失败的。

第一个选项也会匹配“foobar”我相信,尽管我想要键值对。不知道为什么我没有想到这一点,正则表达式中已经有很多相同的构造!最终看起来确实很混乱,但我想那只是正则表达式!恐怕我还不能投票支持你…我实际上只是使用了一个不匹配的组,但我现在明白我基本上需要“=?”为了让我所做的工作在两组之间发挥作用。我确实暂时让它与=匹配,并从一开始就将其切掉,但鉴于我已经在做大量的正则表达式,这似乎有点黑客化,我还不如让它与我真正想要的匹配!当然!非匹配组。像筛子一样小心,doncha知道。