Выберите конкретную строку, допускающую незначительное написание - PullRequest
4 голосов
/ 05 июля 2019

У меня много немецких названий улиц.Большинство из них заканчиваются словом ...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, что означает переулок)

Любая помощь очень ценится.

EDIT :

больше примеров

street_names <- c("GERBERSTRAE", "NEUE STRAASSE", "SCHLOSSSTASSE", "HAUPTSTRASSE", "LINDENSASSE",
                  "WINZERGASSE", "PARKSTRASE", "ALTE STTRASSE", "BACHSTRAS", "LANGE SRASS")

Ответы [ 4 ]

1 голос
/ 05 июля 2019

Вы можете использовать

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 .

0 голосов
/ 05 июля 2019

Немного грубой силы, но я думаю, что сэкономить:

gsub("(STRAE$)|(STRAASSE$)|(STASSE$)|(STRASSE$)", "STR", street_names)
[1] "GERBERSTR"   "NEUE STR"    "SCHLOSSSTR"  "HAUPTSTR"    "WINZERGASSE"
0 голосов
/ 05 июля 2019

Добавление знака вопроса к каждому символу в шаблоне делает их необязательными, поэтому шаблон в основном будет соответствовать всему.Гораздо проще просто перечислить общие орфографические ошибки и жить с тем фактом, что некоторые люди найдут креативные варианты написания, о которых вы даже не подумали.

0 голосов
/ 05 июля 2019

Я не знаю, сколько разных типов типографских ошибок вы можете встретить.Для приведенных вами примеров, что-то вроде этого будет работать:

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