R通配符匹配特定数量的术语

时间:2015-07-15 03:36:47

标签: regex r

假设我有一个字符串并且正在搜索特定的通配符。例如:

x <- "AJSDKLAFJASFJABJKADL"
z <- stri_locate_all_regex(x, 'A*****AF')

我想搜索A和AF之间任意5个字符的所有字词,例如ABJDKAAF或AJSDKLAF ...但是上面的代码不起作用。我有一个简单的方法可以做到这一点吗?谢谢!

2 个答案:

答案 0 :(得分:3)

在正则表达式中(与您可能习惯使用的标准通配符相对),*表示“前面一个字符的0或更多”,因此“A *”表示“0或更多A”。你不能像'****'那样堆叠它们,因为你想要'。'这意味着“一个角色”。

z <- stri_locate_all_regex(x, 'A.....AF')

TL,DR:正则表达式问题,而不是R问题。

答案 1 :(得分:2)

简单方式来执行此操作,并且我认为您的意思是要在问题中使用通配符,您可以使用{{1将这些字符转换为正确的正则表达式}}。 “通配符”表达式,也称为“glob”,是一种穷人的正则表达式(glob2rx())。对于表达式,您可以指定五个?regex个字符,因为在glob中,?表示任何单个字符。

?

如果通配符匹配,则返回逻辑向量。

相比之下,x <- c("ABCDEFAF", "XABCDEFAFX", "abcdeaf", "A55555AF", "A666666AF") # the (simpler?) "wildcard" way stringi::stri_detect_regex(x, glob2rx("A?????AF")) ## [1] TRUE FALSE FALSE TRUE FALSE # the regular expression way (probably WRONG) stringi::stri_detect_regex(x, "A.{5}AF") ## [1] TRUE TRUE FALSE TRUE FALSE # the regular expression way (CORRECT) stringi::stri_detect_regex(x, "^A.{5}AF$") ## [1] TRUE FALSE FALSE TRUE FALSE 返回维度1,2的矩阵列表,其中列是字符串中匹配项的起始和结束字符位置,或者是一对stri_locate_all_regex()值,如果找不到模式。

请注意,通配符/ glob表达式的一个区别是,要获得NA +任意五个字符+ A而没有任何前置或尾随字符,您需要指定正则表达式字符对于字符串的开头和结尾,如上所述。否则,匹配也会获得AF。对于通配符/ glob,这不是问题,因为表达式的开头和结尾匹配字符串的开头和结尾:

"XABCDEFAFX"