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

  • 本文关键字:术语 通配符 regex
  • 更新时间 :
  • 英文 :


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

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

我想搜索在A和AF之间有任何5个字符的所有术语,如ABJDKAAF或AJSDKLAF…然而,上面的代码不起作用。有没有我忽略了的简单方法?谢谢你!

在正则表达式中(与您可能习惯的标准通配符相反),*表示"前一个字符中的0个或多个",因此"A*"表示"0个或多个A"。你不能像'****'那样堆叠它们,因为你想要'。',意思是"一个字符"。

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

TL,DR: regex问题,而不是R问题。

对于的简单方法,我假设您的意思是要像问题中那样使用通配符,您可以使用glob2rx()将这些字符转换为适当的正则表达式。"通配符"表达式,也称为"glob",是一种穷人的正则表达式(?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

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

相比之下,stri_locate_all_regex()返回一个维度为1,2的矩阵列表,其中列是字符串中匹配的开始和结束字符的位置,如果没有找到模式,则返回一对NA值。

请注意,通配符/glob表达式中的一个区别是,要获得A +任意五个字符+ AF,而不包含任何前面或后面的字符,您需要为字符串的开始和结束指定正则表达式字符,如上所述。否则匹配也会选择"XABCDEFAFX"。对于通配符/glob,这不是问题,因为表达式的开始和结束与字符串的开始和结束匹配:

> glob2rx("A?????AF")
[1] "^A.....AF$"

最新更新