POSIX字符类在基本R正则表达式中无法使用。

4

我在使用R时,遇到了一些在文本串中匹配模式的问题。

我想要用grepl函数来判断文本串是否匹配类似于"字母或数字或空格 y 字母或数字或空格"这样的格式,如果匹配成功则返回TRUE

我正在使用以下的正则表达式

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

使用以下regex来获取"address"时,它按预期工作。
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"

谢谢!


POSIX字符类必须在括号表达式内。[:alnum:] -> [[:alnum:]]。另外,您似乎想要在grepl中使用PCRE模式,请添加perl=TRUE - Wiktor Stribiżew
成功了!谢谢!!=) - M.Pico
1个回答

5
尽管stringr ICU正则表达式引擎支持在模式中使用裸的POSIX字符类,但在基础R正则表达式风格(包括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

查看在线演示

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

模式详细信息

  • [[:alnum:][:blank:]]+ - 匹配 1 个或多个字母数字或横向空格符号
  • [[:blank:]] - 匹配 1 个横向空格符号
  • [yY] - 匹配 yY
  • [[:blank:]] - 匹配 1 个横向空格符号
  • [[:alnum:][:blank:]]+ - 匹配 1 个或多个字母数字或横向空格符号

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接