【问题标题】:matching words that contain 2 or more 2-letter sequences of vowels匹配包含 2 个或更多 2 字母元音序列的单词
【发布时间】:2018-06-08 05:14:59
【问题描述】:

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

(那是一年前的事)

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

编写一个正则表达式,匹配包含 2 个或多个 2 字母元音序列的单词(例如 visionproof, st eamier, preequip)

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

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

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

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

【问题讨论】:

  • 所以您要求最多依次输入 2 个元音?或者您是否要求最多 2 个相同的元音,这样 ooee 有效但 ooo 无效?
  • 不,我要的是包含两个以上 2 元音组的单词。例如,visionproof 将是一个很好的匹配,因为它具有 IO 和 OO。但是我给出的正则表达式也匹配带有 3 个元音集的单词 - 这是错误的
  • 没错。 Beautiful 有 3 个连续的元音。 Cooeed 有 4 个连续的元音...
  • “编写一个匹配包含 2 个或多个 2 字母元音序列的单词的正则表达式”。 Beautiful 不满足这个要求,因为它只有一个 3 字母的元音序列。我想说的是元音序列不能大于2。
  • \w 替换为[pytrwqsdfghjklmnbvcxz],你不希望出现[aeiou]

标签: python regex linux shell


【解决方案1】:

试试这个正则表达式:

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

Click for Demo

说明:

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

【讨论】:

    【解决方案2】:

    代码

    (?<![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]
    

    说明

    正则表达式

    • (?&lt;![aeiou]) 负向后视确保前面的不是aeiou 中的字符
    • [aeiou]{2} 匹配 aeiou 正好两次
    • (?![aeiou]) 负前瞻确保后面的内容与aeiou 中的字符不匹配

    生成器表达式

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多