匹配包含2个或更多2个字母的元音序列的单词

时间:2017-12-27 14:53:20

标签: python regex linux shell

首先,我不确定是否应该开始一个新问题,因为它已经得到回答:Regex - Match words that contain 2 or more 2 letter sequences of vowels

(那是一年前)

但是,我认为它被误解了..

编写一个与包含2个或更多2个字母的元音序列的单词匹配的正则表达式(例如, io npr oo f,st ea m r,pr ee q ui p)

并且给出的答案非常一致:

(\w*(?:[aeiou]{2})\w*(?:[aeiou]{2})\w*)

然而,问题要求 2个字母的序列然而,这个正则表达式匹配(组成)单词,如:plooomdooom和leeezaaar,其中元音序列有超过2个元音

任何想法如何解决这个问题?我认为{2}不允许元音重复两次以上

2 个答案:

答案 0 :(得分:2)

试试这个正则表达式:

\b(?:\w*?(?<![aeiou])[aeiou]{2}(?![aeiou])){2}\w*?\b

Click for Demo

<强>解释

  • \b - 字边界
  • (?:\w*?(?<![aeiou])[aeiou]{2}(?![aeiou])){2}
    • \w*? - 匹配单词字符[a-zA-Z0-9_]
    • 的0 +次出现
    • (?<![aeiou])[aeiou]{2}(?![aeiou]) - 匹配2个连续的元音。此匹配既不应该跟随也不应该是另一个元音
    • {2} - 这将在测试字符串中将上述2个子序列匹配2次
  • \w*? - 一旦测试字符串满足上述所有条件,我们现在有两个2个字母元音。现在我们可以匹配所有内容,直到单词的结尾。因此,匹配0个出现的单词字符
  • \b - 字边界

答案 1 :(得分:0)

代码

(?<![aeiou])[aeiou]{2}(?![aeiou])

用法

See code in use here

import re

words = [
    "Cooeed",
    "Beautician",
    "Coood",
    "Sit",
    "Beautiful",
    "Steam",
    "Visionproof",
    "Visionproofed",
    "Steamier",
    "Preequip"
]

r = re.compile(r"(?<![aeiou])[aeiou]{2}(?![aeiou])", re.I)

print [w for w in words if len(r.findall(w)) >= 2]

说明

正则表达式

  • (?<![aeiou])否定的背后隐藏确保前面的内容不是aeiou中的字符
  • [aeiou]{2}匹配aeiou两次
  • (?![aeiou])否定前瞻确保后续内容与aeiou中的字符不匹配

生成器表达式

  • print [w for w in words if len(r.findall(w)) >= 2]
    • 打印words中正则表达式(?<![aeiou])[aeiou]{2}(?![aeiou])匹配两次或多次的单词列表