R中,一个关于正则表达式的问题-stringr package (str_remove_all)

In R, a question about regular expressions -stringr package (str_remove_all)

在R中,有一个字符'X201A61NA231.1W',我想替换所有字母和'NA','.1'。但是下面的代码失败了。任何人都可以帮忙吗?谢谢。

library(stringr)
t_chart <- 'X201A61NA231.1W'
t_chart %>% str_remove_all('[X|NA|W|(/.1)]')

你可以使用-

t_chart <- 'X201A61NA231.1W'
stringr::str_remove_all(t_chart, '[A-Z]|\.1')
#[1] "20161231"

在基础 R 中使用 gsub -

gsub("[A-Z]|\.1", "", t_chart)

您可以列出要在一个字符 class 中删除的所有单个字符并重复该操作 1 次或多次,因为有 NA 但也有一个 A并在字符 class 之外使用交替 | 来匹配带有反斜杠的 .1 以转义点。

注意字符 class 内的 | 匹配管道字符。

t_chart <- 'X201A61NA231.1W'
gsub("[XWNA]+|\.1", "", t_chart)

输出

[1] "20161231"

[X|NA|W|(/.1)] 模式是一个 字符 class。它匹配 class 中定义的任何 单个 字符。因此,它匹配 X|NAW(/., 1) 个字符。

当你需要匹配 sequences 字符时,你应该使用 grouping constructs like capturing or non-capturing groups with alternation ((...|...)(?:...|...)), 或者 - 如果这些交替是整个模式,只需使用 | OR 运算符来分隔替代而不进行任何分组。

要匹配任何字母,您可以使用 \p{L}[:alpha:],如果您只需要处理 ASCII 字母,甚至可以使用 [a-zA-Z]。要匹配后跟 1 的点,您需要 \.1(请注意转义点,因为它是一个特殊的正则表达式元字符)。

您的代码可以固定为

t_chart %>% str_remove_all('[[:alpha:]]+|\.1')
t_chart %>% str_remove_all('\p{L}+|\.1')
t_chart %>% str_remove_all('[a-zA-Z]+|\.1')

注意 R 字符串文字中的双转义反斜杠。