Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中使用正则表达式检测一类字符中的一个或两个重复字符_R_Regex_Stringr - Fatal编程技术网

在R中使用正则表达式检测一类字符中的一个或两个重复字符

在R中使用正则表达式检测一类字符中的一个或两个重复字符,r,regex,stringr,R,Regex,Stringr,我希望检测一类字符中的一个或多个重复字符,但不检测该类中唯一字符的组合。在下面的示例中,我们在r之前寻找p、t或k的实例。这三个词都满足下面的正则表达式,但我想排除像bektri这样的情况,其中r前面有两个不同的辅音 示例当字母组合前面有k时,您可以使用否定查找(?)来排除匹配项 example <- c("betri", "bettri", "bektri") str_detect(example, "(?<!k)[ptk]r") [1] TRUE TRUE FALSE 示例

我希望检测一类字符中的一个或多个重复字符,但不检测该类中唯一字符的组合。在下面的示例中,我们在r之前寻找p、t或k的实例。这三个词都满足下面的正则表达式,但我想排除像bektri这样的情况,其中r前面有两个不同的辅音


示例当字母组合前面有
k
时,您可以使用否定查找
(?)来排除匹配项

example <- c("betri", "bettri", "bektri")
str_detect(example, "(?<!k)[ptk]r")
[1]  TRUE  TRUE FALSE
示例
编辑:
我注意到我误读了你的帖子,当你在
r
之前有两个不同的辅音时,你需要排除匹配项

那么,我将使用下面的正则表达式:<代码>(?),它将匹配在代码> R>代码之前的任何一个或两个辅音,无论是在单词的开头还是在中间。

这是怎样的?

库(stringr)
示例[1]TRUE FALSE
([ptk])\\1{1}r
在r之前匹配p、t或k两次;
\\1{1}
匹配前面组中的一个字符--
([ptk])

([^ptk])([ptk])r
匹配r之前的p、t或k,前提是它前面没有p、t或k

您还可以概括为包含遵循该模式的任何辅音:

库(stringr)
示例[1]TRUE FALSE TRUE FALSE TRUE

我这样理解:
p
k
t
可以在
r
之前出现一次或多次,但只能出现在单词的开头或元音之后。如果是这样,你可以使用
stru检测(例如,(?:^[eyuioa])([ptk])\\1*r”)
。如果单词可以在较长的字符串中,
(?:\\b.[eyuioa([ptk])\\1*r“
如果我对这个问题的理解是正确的,我建议您将beptri和truck添加到
示例中
,并写下“betri、bettri和truck不错,但bektri和beptri不好”。我不知道r,但您是否需要第一组以外的捕获组?我使用
([ptk])\\1+r[ptk][ptk]r
得到了同样的结果。
(?:([ptk])\\1+[ptk][ptk])r
可能读得更好(但可能不是)。我对这个问题的理解是,
r
前面必须有
p
t
k
。如果后一个字符位于行的开头,则存在匹配。如果后一个字符不在行的开头,则在其前面有一个字符而不是
p
,则存在匹配>,
t
k
。请参阅我对这个问题的评论,实际上,它要求澄清。Cary的评论是正确的,出于我的目的,我们需要排除任何不完全相同的辅音组合,不仅仅是k。但感谢您的帮助!这正是我编辑中的regex所做的,与@paqmo的解决方案相反,它也是适用于以两个辅音开头的单词,如“truck”。
example <- c("betri", "bettri", "bektri")
str_detect(example, "(?<!k)[ptk]r")
[1]  TRUE  TRUE FALSE