为了账号安全,请及时绑定邮箱和手机立即绑定

匹配列表中 4 个或更多单词的正则表达式

匹配列表中 4 个或更多单词的正则表达式

九州编程 2022-07-26 09:40:56
背景我们有一个维护正则表达式存储库的系统,并根据这些正则表达式检查一些传入文本以用于某些过滤目的。我们正在尝试构建的正则表达式之一如下所述。由于生产限制,我正在寻找的解决方案严格基于正则表达式。问题我有一个单词列表:word1、word2、word3、word4、word5、word6、word7、word8、word9、word10。我正在尝试编写一个匹配字符串的正则表达式,如果它包含 4 个或更多这些单词,在任何位置的任何位置。例子"Abc word3 def word2 ghi word7 jkl word1 mno word5" 应该是匹配的,因为它在给定列表中包含超过 4 个单词。"Abc word2 def ghi word8" 不应该匹配,因为它只有给定列表中的 2 个单词。当前状态我有以下正则表达式,但它似乎没有做我需要的。((?i)((word1)|(word2)|(word3)|(word4)|(word5)|(word6)|(word7)|(word8)|(word9)|(word10))\b){4,}请用 Java 或 Python 表示法提出任何建议?编辑:添加了一些背景信息。
查看完整描述

3 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

以下正则表达式适用于我的所有测试:

(?i)(.*(^|\b)((word1)|(word2)|(word3)|(word4)|(word5)|(word6)|(word7)|(word8)|(word9)|(word10))($|\b).*){4,}

他们包括:

  1. “Abc word3 def word2 ghi word7 jkl word1 mno word5”-> true

  2. “Abc word2 def ghi word8”-> false

  3. “word3 sadasd sadasd word1 word2 word4”-> true

  4. “word3 sadasd sadasd word1 word2word4”-> false

  5. “aword3 sadasd sadasd word1 word2 word4”-> false

  6. “word3 sadasd sadasd word1 word2 word4a”-> false

我认为您的原始正则表达式主要缺少.*匹配关键字前后的任何字符串。

我还仔细检查了它是否是关键字(测试 5)之前的行首或边界字符,我认为这也是缺失的。


查看完整回答
反对 回复 2022-07-26
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您不需要使用正则表达式。如果您只关心任何单词的出现次数,那么您可以将输入列表转换为 aset并对其执行intersection操作。


wrd_list = ["word1", "word2", "word3", "word4", "word5", "word6", "word7", "word8", "word9", "word10"]


s = "Abc word3 def word2 ghi word7 jkl word1 mno word5"


if len(set(wrd_list).intersection(s.split())) > 4:

    print('more than 4 occurrences found')

编辑:此代码在 Python 中


查看完整回答
反对 回复 2022-07-26
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

也许这个(不是正则表达式,但我认为更具可读性):


words = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10']

text = "Abc word2 def ghi word8"

sum(i in text for i in words)


查看完整回答
反对 回复 2022-07-26
  • 3 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信