在R中使用正则表达式检测一类字符中的一个或两个重复字符
我希望检测一类字符中的一个或多个重复字符,但不检测该类中唯一字符的组合。在下面的示例中,我们在r之前寻找p、t或k的实例。这三个词都满足下面的正则表达式,但我想排除像bektri这样的情况,其中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 示例
示例当字母组合前面有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