我想匹配一个单词,然后在它之前得到所有内容,直到句号的第一次出现或字符串的开头。
例如,给定此字符串并搜索单词“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.
我正试图让我的头脑前瞻和后视,但是(看起来)你不能轻易回头看直到你击中了什么东西,只有当它紧挨着它你的模式。我可以非常接近这个:
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
答案 0 :(得分:5)
您无需使用外观来完成此操作。被否定的角色类是你最好的朋友:
(?:[^\s.][^.]*)?regex[^.]*\.?
或
[^.]*regex[^.]*\.?
这样你就可以在“regex”这个词之前取任何字符,并禁止这些字符中的任何一个成为一个点。
第一个图案左边是白色空格,第二个是更基本的。
关于您的模式:
不要忘记正则表达式引擎尝试从字符串的左侧到右侧的每个位置成功。这就是为什么类似(?:(?<=\.)|(?<=^)).*?regex
的东西并不总是返回点或字符串的开头和单词“regex”之间的最短子串,即使你使用非贪婪的量词。最左边的位置总是获胜,而非贪婪的量词会占用字符,直到下一个子模式成功为止。
另外,再一次,否定的角色类可能很有用:
缩短(?:(?<=\.)|(?<=^))
你可以写(?<![^.])