正则表达式来测试是否有一个词恰好出现了 2 次

Regex to test if there's a word appeared exactly 2 times

给定一个字符串,测试是否有一个单词恰好出现了两次

Input Pass
apple banana pineapple No
apple banana apple pineapple Yes
apple banana banana pineapple Yes
apple banana apple pineapple apple No
apple banana apple banana Yes
apple banana banana apple pineapple apple Yes

我尝试过类似的方法但没有成功:(

^.*(\b\w+\b)(?:(?!\b\b).)*\b\b(?:(?!\b\b).)*$

有什么建议吗?我正在使用 pcre.

使用允许动态长度回顾的 PyPi regex 模块:

\b(\w+)\b(?<!\b\b.*\b\b)(?:(?!\b\b).)*?\b\b(?!.*\b\b)

RegEx Demo

代码:

>>> import regex as re
>>> arr = ["apple banana pineapple", "apple banana apple pineapple", "apple banana banana pineapple",
... "apple banana apple pineapple apple", "apple banana apple banana", "apple banana banana apple pineapple apple"]
>>> reg = re.compile(r'\b(\w+)\b(?<!\b\b.*\b\b)(?:(?!\b\b).)*?\b\b(?!.*\b\b)')
>>> for i in arr: print (i, '=>', reg.findall(i))
...
apple banana pineapple => []
apple banana apple pineapple => ['apple']
apple banana banana pineapple => ['banana']
apple banana apple pineapple apple => []
apple banana apple banana => ['apple']
apple banana banana apple pineapple apple => ['banana']

正则表达式详细信息:

  • \b(\w+)\b: 将一个词与词边界匹配并捕获到组#1
  • (?<!\b\b.*\b\b):动态长度回溯断言我们在这个词之前没有相同词的另一个实例
  • (?:(?!\b\b).)*?\b\b:匹配同一个词的另一个实例,同时确保我们不匹配两次重复之间的同一个词
  • (?!.*\b\b): 最后让我们前面没有这个词的其他实例,从而确保只有2个实例

较早的答案:

这个具有负前瞻性的正则表达式可能有效:

^(?!.*?\b(\w+)\b(?:.*\b\b){2}).*?\b(\w+)\b.*\b\b

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?!:负向后启动
    • .*?:匹配0个或多个任意字符
    • \b(\w+)\b:匹配并抓取一个词 - (?:.*\b\b){2}: 如果同一个词至少出现两次
  • ):负向后看结束
  • .*?:匹配0个或多个任意字符
  • \b(\w+)\b: 匹配并捕获捕获组#2
  • 中的一个词
  • .*\b\b:确保同一个词至少出现一次

获取下一个单词。如果正好包含 2 次,则停止。循环。

^(?*.*?\b(\w+)\b)(?>.*?\b\b){2}(?!.*\b\b)

Demo