首先,我不确定是否应该开始一个新问题,因为它已经得到回答: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}不允许元音重复两次以上
答案 0 :(得分:2)
试试这个正则表达式:
\b(?:\w*?(?<![aeiou])[aeiou]{2}(?![aeiou])){2}\w*?\b
<强>解释强>
\b
- 字边界(?:\w*?(?<![aeiou])[aeiou]{2}(?![aeiou])){2}
\w*?
- 匹配单词字符[a-zA-Z0-9_]
(?<![aeiou])[aeiou]{2}(?![aeiou])
- 匹配2个连续的元音。此匹配既不应该跟随也不应该是另一个元音{2}
- 这将在测试字符串中将上述2个子序列匹配2次\w*?
- 一旦测试字符串满足上述所有条件,我们现在有两个2个字母元音。现在我们可以匹配所有内容,直到单词的结尾。因此,匹配0个出现的单词字符\b
- 字边界答案 1 :(得分:0)
(?<![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])
匹配两次或多次的单词列表