正则表达式匹配回句点或字符串开头

2024-02-27

我想匹配一个单词,然后获取它之前的所有内容,直到第一次出现一个句点或字符串的开头。

例如,给定此字符串并搜索单词“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(使用前将#替换为@)

正则表达式匹配回句点或字符串开头 的相关文章

随机推荐