我想在数据库中搜索和替换某些字符,但不是在所有行中替换。
这是我的数据库:
1. 41 R JEAN JAURES 93170
2. 42 AV DE STALINGRAD 93170
3. 51 57 R JULES FERRY 93170
4. 1 R DU HAVRE 93170
我想替换为:
5. 41 RUE JEAN JAURES 93170
6. 42 AVENUE DE STALINGRAD 93170
7. 51 57 RUE JULES FERRY 93170
8. 1 RUE DU HAVRE 93170
因此,我尝试使用sub()
函数,但是在2.
中它将替换第一个R
,因此它将是STALING RUE AD,而不是STALING < strong> R AD。
我也尝试使用substr()
,但是像3.中一样,在替换字母前可能会有一些字符。因为我有约60万个地址,所以会有很多这样的例外。
是否可以在这些功能中添加一些限制以实现我的目标?
答案 0 :(得分:1)
您可以使用\\s+
来匹配1个或多个空格,而\\s*
可以匹配0个或多个空格。
vec <- c("41 R JEAN JAURES 93170",
"42 AV DE STALINGRAD 93170",
"51 57 R JULES FERRY 93170",
"1 R DU HAVRE 93170")
library(magrittr)
vec %>%
gsub("\\s*R\\s+", " RUE ", .) %>%
gsub("\\s*AV\\s+", " AVENUE ", .)
[1] "41 RUE JEAN JAURES 93170" "42 AVENUE DE STALINGRAD 93170"
[3] "51 57 RUE JULES FERRY 93170" "1 RUE DU HAVRE 93170"
此外,您可以考虑使用\\b
来限制单词边界(包括空格):
vec %>%
gsub("\\bR\\s+", "RUE ", .) %>%
gsub("\\bAV\\s+", "AVENUE ", .)
答案 1 :(得分:-1)
您可以使用stringr
尝试一些正则表达式。如果“ RUE”的“ R”将始终是每行中的第一个“ R”字符,则可以使用stringr::str_replace
,它仅替换每个字符串中的第一个匹配项:
library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.5.1
data <- c(
"1. 41 R JEAN JAURES 93170",
"2. 42 AV DE STALINGRAD 93170",
"3. 51 57 R JULES FERRY 93170",
"4. 1 R DU HAVRE 93170")
data %>%
str_replace("(?<!\\w)R(?!\\w)", "RUE")
#> [1] "1. 41 RUE JEAN JAURES 93170" "2. 42 AV DE STALINGRAD 93170"
#> [3] "3. 51 57 RUE JULES FERRY 93170" "4. 1 RUE DU HAVRE 93170"
编辑:根据评论在“ R”之后添加第二个reprex