如何匹配 R 中的二项式表达式?
How to match binomial expressions in R?
我想匹配二项式,即双音节词,有时连字符,音节重叠略有不同;变化总是与重复音节中的第一个(可能还有第二个)字母有关:
x <- c("pow-wow", "pickwick", "easy-peasy", "nitty-gritty", "bzzzzzzz", "mmmmmm", "shish", "wedged", "yaaaaaa")
在这里,我们在 pow-wow
、pickwick
、easy-peasy
和 nitty-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
详情
\b
- 单词边界(如果您的“单词”等于整个字符串,您可以使用 ^
)
\w{0,2}
- 两个或多个单词字符(替换为 \p{L}
以仅匹配字母)
(?!((.)+)(?!.*)|ed)
- 不允许 ed
或两个或更多不在字符串中重复的相同字符紧邻当前位置的右侧
([aeiou]\w+)
- 一个元音(在第 3 组中捕获)和 1 个以上的单词字符(替换为 \p{L}
以仅匹配字母)
-?
- 一个可选的连字符
\w\w?
- 1 或 2 个单词字符
</code> - 与第 3 组中捕获的值相同</li>
<li><code>\b
- 单词边界(如果您的“单词”等于整个字符串,您可以使用 $
)
我想匹配二项式,即双音节词,有时连字符,音节重叠略有不同;变化总是与重复音节中的第一个(可能还有第二个)字母有关:
x <- c("pow-wow", "pickwick", "easy-peasy", "nitty-gritty", "bzzzzzzz", "mmmmmm", "shish", "wedged", "yaaaaaa")
在这里,我们在 pow-wow
、pickwick
、easy-peasy
和 nitty-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
详情
\b
- 单词边界(如果您的“单词”等于整个字符串,您可以使用^
)\w{0,2}
- 两个或多个单词字符(替换为\p{L}
以仅匹配字母)(?!((.)+)(?!.*)|ed)
- 不允许ed
或两个或更多不在字符串中重复的相同字符紧邻当前位置的右侧([aeiou]\w+)
- 一个元音(在第 3 组中捕获)和 1 个以上的单词字符(替换为\p{L}
以仅匹配字母)-?
- 一个可选的连字符\w\w?
- 1 或 2 个单词字符</code> - 与第 3 组中捕获的值相同</li> <li><code>\b
- 单词边界(如果您的“单词”等于整个字符串,您可以使用$
)