我想要匹配二元音,也就是说,双音节词,有时连字符,与略为变化的音节重叠;变体总是涉及重叠式音节中的第一个字母(也可能是第二个):
x <- c("pow-wow", "pickwick", "easy-peasy", "nitty-gritty", "bzzzzzzz", "mmmmmm", "shish", "wedged", "yaaaaaa")在这里,我们在pow-wow、pickwick、easy-peasy和nitty-gritty (这是预期的输出)中说过音节重叠,但在bzzzzzzz、mmmmmm、shish、wedged和yaaaaa中没有。
这个正则表达式至少可以消除wedged(发音为一个音节)和单音节单词,方法是要求捕获组中有一个元音:
grep("\\b\\w?((?!ed)(?=[aeiou])\\w{2,})-?\\w\\w?\\1\\b$", x, value = T, perl = T)
[1] "pow-wow" "pickwick" "easy-peasy" "nitty-gritty" "yaaaaa" 然而,yaaaaa也得到了匹配。为了不匹配,我的感觉是捕捉组不允许包含两个相同的元音,但我不知道如何实现这个限制。有什么想法吗?
发布于 2020-07-06 11:36:45
看起来,如果在字符串中找不到相同的块,则需要匹配在初始字符和2个或更多重复字符之后不能包含ed的单词。此外,允许的“差异”窗口在开头和中部是0到2个字符。
你可以用
\b\w{0,2}(?!((.)\2+)(?!.*\1)|ed)([aeiou]\w+)-?\w\w?\3\b详细信息
\b -一个单词边界(如果您的“单词”等于整字符串,可以使用^ )。\w{0,2} -两个或多个单词字符(用\p{L}替换为只匹配字母)(?!((.)\2+)(?!.*\1)|ed) -不允许在字符串后面重复的ed或两个或多个相同的字符立即位于当前位置的右侧。([aeiou]\w+) -元音(在第3组中捕获)和1+单词字符(用\p{L}替换为只匹配字母)-? -一个可选的连字符\w\w? -1或2个字charsd\3 -与第3组捕获的值相同\b -一个单词边界(如果您的“单词”等于整字符串,可以使用$ )。https://stackoverflow.com/questions/62754429
复制相似问题