正则表达式拉子路径

问题描述 投票:1回答:3

我有一个数据框df,其中包含一个包含字符串的地方字段,如下所示:

countryName0 / provinceName0 / countyName0 / cityName0
countryName1 / provinceName1

使用此代码,我可以提取最好的分辨率地点标识符:

df$shortplace <- trimws(basename(df$place))

要么:

df$shortplace <- gsub(".*/ ", "", df$place)

EG

cityName0
provinceName1

然后我可以使用ggmap库来提取cityName0和provinceName1的地理编码:

df$geo <- geocode(df$shortplace)

结果如下所示:

geo.lat   geo.long
-33.789    147.909
-29.333    133.819

不幸的是,一些城市名称不是唯一的,例珀斯是西澳大利亚州的首府,是塔斯马尼亚的一个小镇,也是苏格兰的一个城市。我需要做的是在最后一个“/”之后不提取地点标识符,而在最后一个“/”之后提取地址标识符(并用“”替换“/”以提供geocode()函数的更多信息。我如何扫描到倒数第二个“/”并提取最高和第二高位地名?例如

                shortplace
     countyName0 cityName0
countryName1 provinceName1
r
3个回答
0
投票

还有其他方法,但strsplit()对我来说似乎最直接。尝试一下:

x = "countryName0 / provinceName0 / countyName0 / cityName0"
x_split = strsplit(x, " / ")[[1]] # Somewhat confusingly, result of strsplit() is a list; [[1]] pulls out the one and only entry here
n_terms = length(x_split)
result = paste(x_split[n_terms - 1], x_split[n_terms], sep = ", ")
result
# [1] "countyName0, cityName0"

0
投票

一个选项是sub匹配字母数字字符后跟一个或多个空格,/后跟空格(\\s+),然后是另一组字母数字字符,直到字符串结尾($),作为一组捕获并替换为捕获组的反向引用(\\1 \\2

df$shortplace <- sub(".*\\b([[:alnum:]]+)\\s+\\/\\s+([[:alnum:]]+)$", "\\1 \\2", df$place)
df$shortplace
#[1] "countyName0 cityName0"      "countryName1 provinceName1"

0
投票

这最终对我有用:

df$shortplace <- gsub("((?:/[^/\r\n]*){2})$", "\1", df$place)
df$shortplace <- gsub("\\ / ", ", ", df$place)

不是超级优雅,但它做的工作。

© www.soinside.com 2019 - 2024. All rights reserved.