R:使用正则表达式识别空格

R: Using Regex To Recognizes Spaces

提问人:stats_noob 提问时间:11/21/2022 最后编辑:SecretAgentManstats_noob 更新时间:11/23/2022 访问量:41

问:

我正在使用 R 编程语言。

我有一个数据框,如下所示:

id = 1:3
var= c("123 river street A1B 6L2", "124 ocean road g7u 6p2 apartment number 5", "apartment 6 k8b 7Ji"   )
my_data = data.frame(id, var)

  id                                       var
1  1                  123 river street A1B 6L2
2  2 124 ocean road g7u 6p2 apartment number 5
3  3                       apartment 6 k8b 7Ji

我正在尝试获得以下输出 - 我想删除每行中字母数字序列之间的空格:

  id                                       var no_space  spaces                                var_final
1  1                  123 river street A1B 6L2  A1B 6L2  A1B6L2                  123 river street A1B6L2
2  2 124 ocean road g7u 6p2 apartment number 5  g7u 6p2  g7u6p2 124 ocean road g7u6p2 apartment number 5
3  3                       apartment 6 k8b 7Ji  k8b 7Ji  k8b7Ji                       apartment 6 k8b7Ji

我知道如何以间接的方式开始:

spaces = apply(my_data, 1, function(x) gsub('(([A-Z] ?[0-9]){3})|.', '\\1', toString(x)))
no_spaces = trimws(spaces)

但我不确定如何继续这样做。

有人可以告诉我如何进行吗?

r 正则表达式 字符串 数据操作

评论


答:

3赞 Wiktor Stribiżew 11/21/2022 #1

你可以使用

id = 1:3
var= c("123 river street A1B 6L2", "124 ocean road g7u 6p2 apartment number 5", "apartment 6 k8b 7Ji"   )
my_data = data.frame(id, var)

library(stringr)
regex <- "\\b(?:\\d+[A-Za-z]|[A-Za-z]+\\d)[A-Za-z\\d]*(?:\\s+(?:\\d+[A-Za-z]|[A-Za-z]+\\d)[A-Za-z\\d]*)+\\b"
str_replace_all(my_data$var, regex, function(x) str_replace_all(x, "\\s+", ""))
## => [1] "123 river street A1B6L2"                 
## => [2] "124 ocean road g7u6p2 apartment number 5"
## => [3] "apartment 6 k8b7Ji"                     

请参阅正则表达式演示细节

  • \b- 词边界
  • (?:\d+[A-Za-z]|[A-Za-z]+\d)[A-Za-z\d]*- 同时包含数字和字母的字母数字字符串
  • (?:\s+(?:\d+[A-Za-z]|[A-Za-z]+\d)[A-Za-z\d]*)+- 出现一次或多次
    • \s+- 一个或多个空格
    • (?:\d+[A-Za-z]|[A-Za-z]+\d)[A-Za-z\d]*- 同时包含数字和字母的字母数字字符串
  • \b- 词边界。

替换参数,用于将每个匹配项替换为自身,但删除所有空格。function(x) str_replace_all(x, "\\s+", "")stringr::str_replace_all