如何匹配 R 中的二项式表达式?

How to match binomial expressions in R?

我想匹配二项式,即双音节词,有时连字符,音节重叠略有不同;变化总是与重复音节中的第一个(可能还有第二个)字母有关:

x <- c("pow-wow", "pickwick", "easy-peasy", "nitty-gritty", "bzzzzzzz", "mmmmmm", "shish", "wedged", "yaaaaaa")

在这里,我们在 pow-wowpickwickeasy-peasynitty-gritty 中说了音节重复(这就是预期的输出)但是 not in bzzzzzzz, mmmmmm, shish, wedged and 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 也正在匹配。为了 not 匹配它,我的感觉是捕获组不应包含两个相同的直接连续的元音,但我不知道如何实施该限制。 有什么想法吗?

如果在字符串中更远的地方找不到相同的块,那么您似乎想要匹配初始字符后不能包含 ed 和 2 个或更多重复字符的单词。此外,开头和中间允许的“差异”window 是 0 到 2 个字符。

您可以使用

\b\w{0,2}(?!((.)+)(?!.*)|ed)([aeiou]\w+)-?\w\w?\b

regex demo

详情

  • \b - 单词边界(如果您的“单词”等于整个字符串,您可以使用 ^
  • \w{0,2} - 两个或多个单词字符(替换为 \p{L} 以仅匹配字母)
  • (?!((.)+)(?!.*)|ed) - 不允许 ed 或两个或更多不在字符串中重复的相同字符紧邻当前位置的右侧
  • ([aeiou]\w+) - 一个元音(在第 3 组中捕获)和 1 个以上的单词字符(替换为 \p{L} 以仅匹配字母)
  • -? - 一个可选的连字符
  • \w\w? - 1 或 2 个单词字符
  • </code> - 与第 3 组中捕获的值相同</li> <li><code>\b - 单词边界(如果您的“单词”等于整个字符串,您可以使用 $