我在将模式与R中的文本字符串匹配时遇到一些问题。

当文本类似于TRUE时,我正在尝试使用grepl获得"lettersornumbersorspaces y lettersornumbersorspaces".
我正在使用以下regex:

([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+

如下使用regex获取“地址”时,它可以正常工作。
regex <- "([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+"
address <- str_extract(fulltext, regex)

我看到该地址是我需要的文字。现在,如果我想使用grepl来获取TRUE,如下所示:
grepl("([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+", address,ignore.case = TRUE)

返回FALSE。这怎么可能?我正在使用相同的regex来获取TRUE。我尝试了对grepl参数的修改,但是没有一个与此相关。

文本的示例是:"26 de Marzo y Pareyra de la Luz"
谢谢!!

最佳答案

尽管Stringer ICU regex引擎在模式中支持裸POSIX字符类,但在基本R regex风格(PCRE(perl=TRUE)和TRE两者)中, POSIX字符类必须位于方括号表达式内。 [:alnum:]-> [[:alnum:]]

x <- c("AZaz09 y AZaz09", "ĄŻaz09 y AZŁł09", "26 de Marzo y Pareyra de la Luz")
grepl("[[:alnum:][:blank:]]+[[:blank:]][yY][[:blank:]][[:alnum:][:blank:]]+", x)
## => [1] TRUE TRUE TRUE
grepl("[[:alnum:][:blank:]]+[[:blank:]][yY][[:blank:]][[:alnum:][:blank:]]+", x, perl=TRUE)
## => [1] TRUE TRUE TRUE

online demo

单独使用[:alnum:]时,它是一个简单的括号表达式,它与单个字符,:alnum匹配。

模式详细信息:
  • [[:alnum:][:blank:]]+-1+字母数字或水平空白符号
  • [[:blank:]]-1个水平空白符号
  • [yY]-yY
  • [[:blank:]]-1个水平空白符号
  • [[:alnum:][:blank:]]+-1+字母数字或水平空白符号
  • 10-04 09:56