选择允许轻微拼写错误的特定字符串

时间:2019-07-05 08:09:56

标签: r regex gsub

我有很多德国街道名。它们大多数以单词...strasse结尾。我想将strasse替换为缩写词str,以便保留诸如straestrassee之类的较小的拼写错误(缺失或错误的1或2个字符)。

我尝试了很多事情,然后又查找了一些东西:

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")

4 个答案:

答案 0 :(得分:1)

您可以使用

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

请参见a demo on regex101.com

答案 1 :(得分:0)

我不知道您会遇到多少种打字错误。对于您给出的示例,类似的方法将起作用:

gsub("STR.*|STA.*","STR",street_names)
[1] "GERBERSTR"   "NEUE STR"    "SCHLOSSSTR"  "HAUPTSTR"   
[5] "WINZERGASSE"

答案 2 :(得分:0)

在模式中的每个字符后加上问号会使它们全部可选,因此该模式将基本匹配所有内容。 完全列出常见的拼写错误并忍受某些人会发现您没有想到的创造性拼写的事实要容易得多。

答案 3 :(得分:0)

有点蛮力,但我想保存:

gsub("(STRAE$)|(STRAASSE$)|(STASSE$)|(STRASSE$)", "STR", street_names)
[1] "GERBERSTR"   "NEUE STR"    "SCHLOSSSTR"  "HAUPTSTR"    "WINZERGASSE"