我想匹配一个单词,然后获取它之前的所有内容,直到第一次出现一个句点或字符串的开头。
例如,给定此字符串并搜索单词“regex”:
s = 'Do not match this. Or this. Or this either. I like regex. It is hard, but regex is also rewarding.'
它应该返回:
>> I like regex.
>> It is hard, but regex is also rewarding.
我试图让我的头脑向前看和向后看,但是(似乎)你不能轻易回头until你击中了某个东西,前提是它紧邻你的模式。我可以非常接近这个:
pattern = re.compile(r'(?:(?<=\.)|(?<=^))(.*?regex.*?\.)')
但它给了我第一个句点,然后是“正则表达式”之前的所有内容:
>> Do not match this. Or this. Or this either. I like regex. # no!
>> It is hard, but regex is also rewarding. # correct
您不需要使用环视来做到这一点。否定的字符类是你最好的朋友:
(?:[^\s.][^.]*)?regex[^.]*\.?
or
[^.]*regex[^.]*\.?
这样,您就可以在“regex”一词之前获取任何字符,并禁止这些字符中的任何字符成为点。
第一个图案在左侧留下空白条纹,第二个图案更为基本。
关于你的模式:
不要忘记,正则表达式引擎会尝试在字符串从左到右的每个位置上取得成功。这就是为什么像(?:(?<=\.)|(?<=^)).*?regex
即使您使用非贪婪量词,也不总是返回点或字符串开头与单词“regex”之间的最短子字符串。最左边的位置总是获胜,并且非贪婪量词会获取字符,直到下一个子模式成功。
顺便说一句,否定的字符类可能会很有用:
削减(?:(?<=\.)|(?<=^))
你可以写(?<![^.])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)