使用`stringr :: str_replace_all`时,">"与"[[:punct:]]"不匹配?

Moo*_*per 7 regex r stringr

我觉得这很奇怪:

pattern <- "[[:punct:][:digit:][:space:]]+"
string  <- "a . , > 1 b"

gsub(pattern, " ", string)
# [1] "a b"

library(stringr)
str_replace_all(string, pattern, " ")
# [1] "a > b"

str_replace_all(string, "[[:punct:][:digit:][:space:]>]+", " ")
# [1] "a b"
Run Code Online (Sandbox Code Playgroud)

这是预期的吗?

Ben*_*ker 7

仍在努力,但?"stringi-search-charclass"说:

注意使用POSIX字符类,例如'[:punct:]'.ICU用户指南(见下文)指出,一般来说,它们没有明确定义,因此最终可能会出现与您预期不同的内容.

特别是,在类似POSIX的正则表达式引擎中,'[:punct:]'代表对应于'ispunct()'分类函数的字符类(在类UNIX系统上查看'man 3 ispunct').根据ISO/IEC 9899:1990(ISO C90),'ispunct()'函数测试任何打印字符,除了空格或'isalnum()'为真的字符.但是,在POSIX设置中,哪些字符属于哪个类的详细信息取决于当前区域设置.因此'[:punct:]'类不会导致可移植代码(同样,在类似POSIX的正则表达式引擎中).

因此'[:punct:]'的POSIX风格更像'ICU'中的'[\ p {P}\p {S}]'.你被警告了.

复制上面发布的问题,

string  <- "a . , > 1 b"
mypunct <- "[[\\p{P}][\\p{S}]]" 
stringr::str_remove_all(string, mypunct)
Run Code Online (Sandbox Code Playgroud)

我可以欣赏特定于语言环境的东西,但它仍然让我感到惊讶,[:punct:]甚至不能在C语言环境中工作......

  • 谢谢,所以为了安全起见,我使用 `str_replace_all(string, "[[\\p{P}][\\p{S}]\\d\\s]+"," ")` ,并从'?stringi::``stringi-search-regex``' 我得到 `\p{UNICODE PROPERTY NAME} : 匹配具有指定 Unicode 属性的任何字符。` 和 https://en.wikipedia.org/wiki/Unicode_character_property告诉我“P”代表标点符号,“S”代表符号。 (2认同)