我有很多德国街道名称。他们中的大多数都以单词结尾...strasse
.我想用它的缩写替换strasse
str
允许轻微的拼写错误(1 或 2 个字符缺失或错误),例如strae
或strassee
.
我尝试了很多东西,并查找了一些:
street_names <- c("GERBERSTRAE", "NEUE STRAASSE", "SCHLOSSSTASSE", "HAUPTSTRASSE", "WINZERGASSE")
> gsub("[STRASSE]{5,7}S?T?R?A?S?S?E?$" , "STR", street_names, perl = T)
[1] "GERBSTR" "NEUE STR" "SCHLOSTR" "HAUPSTR" "WINZERGASSE"
> gsub("S?T?R?A?S?S?E?$" , "STR", street_names, perl = T)
[1] "GERBERSTR" "NEUE STRASTR" "SCHLOSSSTR" "HAUPTSTR"
[5] "WINZERGSTR"
但到目前为止,它们都有一些对和错,我不知道如何将它们结合起来。("Winzergasse"不应该匹配,因为它以Gasse
结尾,翻译为小巷)
任何帮助将不胜感激。
编辑:
更多示例
street_names <- c("GERBERSTRAE", "NEUE STRAASSE", "SCHLOSSSTASSE", "HAUPTSTRASSE", "LINDENSASSE",
"WINZERGASSE", "PARKSTRASE", "ALTE STTRASSE", "BACHSTRAS", "LANGE SRASS")
您可以使用
gsub("GASSE(*SKIP)(*FAIL)|ST*R?[ASE]+$", "STR", street_names, perl = T)
这会产生
[1] "GERBERSTR" "NEUE STR" "SCHLOSSSTR" "HAUPTSTR" "WINZERGASSE"
这里的模式是
GASSE(*SKIP)(*FAIL) # match "GASSE" and let it fail
| # or
ST*R?[ASE]+ # S, T (0 or more times), R (optional), any A, S or E
$ # end of the string
观看有关 regex101.com 的演示。
我不知道您会遇到多少不同类型的印刷错误。对于您给出的示例,这样的事情将起作用:
gsub("STR.*|STA.*","STR",street_names)
[1] "GERBERSTR" "NEUE STR" "SCHLOSSSTR" "HAUPTSTR"
[5] "WINZERGASSE"
在模式中的每个字符后附加一个问号使它们都是可选的,因此模式基本上会匹配所有内容。 完全列出常见的拼写错误并接受这样一个事实,即有些人会发现您没有想到的创造性拼写,这要容易得多。
有点蛮力,但我认为:
gsub("(STRAE$)|(STRAASSE$)|(STASSE$)|(STRASSE$)", "STR", street_names)
[1] "GERBERSTR" "NEUE STR" "SCHLOSSSTR" "HAUPTSTR" "WINZERGASSE"