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

问题描述 投票:2回答:2

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

(那是一年前)

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

写一个正则表达式,匹配包含2个或更多2个字母的元音序列的单词(例如视觉,蒸汽,preequip)

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

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

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

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

python regex linux shell
2个回答
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 - 一个词边界

0
投票

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

Usage

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]

说明

Regex

  • (?<![aeiou])否定的背后隐藏确保前面不是aeiou中的角色
  • [aeiou]{2}匹配aeiou两次
  • (?![aeiou])负向前瞻确保以下内容与aeiou中的角色不匹配

Generator Expression

  • print [w for w in words if len(r.findall(w)) >= 2]words打印一个单词列表,其中正则表达式(?<![aeiou])[aeiou]{2}(?![aeiou])匹配两次或更多次
© www.soinside.com 2019 - 2024. All rights reserved.