首先,我不确定是否应该开始一个新问题,因为它已经得到了回答: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}不允许元音重复两次以上
试试这个正则表达式:
\b(?:\w*?(?<![aeiou])[aeiou]{2}(?![aeiou])){2}\w*?\b
说明:
\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
- 一个词边界(?<![aeiou])[aeiou]{2}(?![aeiou])
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])
匹配两次或更多次