You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python正则表达式获取包含多个指定单词的所有句子?

解决同时包含两个指定单词的句子提取问题

嘿,我来帮你搞定这个正则匹配的难题!你想要提取**同时包含两个指定单词(顺序无关)**的句子,还要避开像价格里的小数点这类干扰,对吧?咱们先看看你原来的正则问题出在哪,再给出可行的方案。

你的原正则存在的问题

你用的([^.]*?(apple)*?(costs)[^.]*\.)有两个核心问题:

  1. 小数点干扰:[^.]是匹配除了句号之外的任意字符,所以遇到0.99里的点就会直接截断,导致句子匹配不完整。
  2. 未强制要求两个单词都存在:(apple)*?是可选匹配(零次或多次),所以哪怕句子里只有costs没有apple,也会被匹配出来,这就不符合你“同时包含两个单词”的需求。

可行的正则方案

我们需要调整正则的思路:先锁定句子的正确边界(区分句子结束的句号和中间的小数点),再强制要求两个单词都存在(顺序无关)。

最终的正则表达式如下:

(?:^|(?<=\.\s))(?=.*?apple)(?=.*?costs)(?:(?!\.\s).)*?\.(?=\s|$)

逐部分解释这个正则:

  • (?:^|(?<=\.\s)):匹配句子的起始位置——要么是文本的开头,要么是前一个句子结束的句号+空格之后,确保我们从一个完整句子的开头开始匹配。
  • (?=.*?apple)(?=.*?costs):这是两个正向预查,用来确保后续的句子内容里同时包含apple和costs,而且不限制它们的顺序(你也可以把两个预查的顺序反过来,效果一样)。
  • (?:(?!\.\s).)*?:匹配句子的主体内容——逐字符匹配,直到遇到句号+空格就停止。这样就不会把价格里的0.99这类小数点当成句子的结束标志。
  • \.(?=\s|$):匹配句子的结束句号,后面要么是空格(下一个句子的开头),要么是文本的结尾,确保这是一个完整句子的结束。

测试示例

用你的示例文本测试:

"Supermarket. This apple costs 0.99."

这个正则会精准匹配到:This apple costs 0.99.,完全符合你的需求,而且不会匹配前面的Supermarket.(因为它不包含两个指定单词)。

代码示例(以Python为例)

如果你要在代码里使用这个正则,可以参考下面的写法:

import re

text = "Supermarket. This apple costs 0.99. Another sentence with only apple. And one with just costs."
pattern = r'(?:^|(?<=\.\s))(?=.*?apple)(?=.*?costs)(?:(?!\.\s).)*?\.(?=\s|$)'
matches = re.findall(pattern, text)
print(matches)  # 输出: ['This apple costs 0.99.']

内容的提问来源于stack exchange,提问作者user9479535

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:42:42