R Regex для определения почтовых индексов Великобритании - PullRequest
0 голосов
/ 25 апреля 2018

Мой вопрос похож на это , но я ищу что-то конкретное R.У меня есть data.frame из десятков тысяч адресов, и мне нужно вытащить почтовые индексы.Почтовые индексы находятся в Великобритании и имеют формат {LETTER_LETTER_DIGIT LETTER_LETTER_DIGIT}.Похоже на следующее:

"8, Longbow Close, \ r \ nHarlescott Lane, \ r \ nShrewsbury, \ r \ nEngland, \ r \ nSY1 3GZ"

Я использовал вариантыэтого кода с stringr безрезультатно:

str_extract('^(\\[Gg]\\[Ii]\\[Rr] 0\\[Aa]{2})|(((\\[A-Za-z]\\[0-9]{1,2})|((\\ 
[A-Za-z]\\[A-Ha-hJ-Yj-y]\\[0-9]{1,2})|((\\[AZa-z]\\[0-9]\\[A-Za-z])|(\\[A-Za- 
z]\\[A-Ha-hJ-Yj-y]\\[0-9]?\\[A-Za-z]))))\\[0-9]\\[A-Za-z]{2})$',alfa$Address) 

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Вот более читаемый способ:

            if ($e{locate} =~ /\b([A-Z])([A-Z])([0-9])([A-Z]) ([0-9])([A-Z])([A-Z])\b/) {
                    $e{zip} = $1.$2.$3.$4.$5.$6.$7;
                    $e{zips} = $1.$2.$3.$4.' ' .$5.$6.$7;
            } elsif ($e{locate} =~ /\b([A-Z])([0-9])([A-Z]) ([0-9])([A-Z])([A-Z])\b/) {
                    $e{zip} = $1.$2.$3.$4.$5.$6;
                    $e{zips} = $1.$2.$3.' '.$4.$5.$6;
            } elsif ($e{locate} =~ /\b([A-Z])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
                    $e{zip} = $1.$2.$3.$4.$5;
                    $e{zips} = $1.$2.' '.$3.$4.$5;
            } elsif ($e{locate} =~ /\b([A-Z])([0-9])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
                    $e{zip} = $1.$2.$3.$4.$5.$6;
                    $e{zips} = $1.$2.$3.' '.$4.$5.$6;
            } elsif ($e{locate} =~ /\b([A-Z])([A-Z])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
                    $e{zip} = $1.$2.$3.$4.$5.$6;
                    $e{zips} = $1.$2.$3.' ' .$4.$5.$6;
            } elsif ($e{locate} =~ /\b([A-Z])([A-Z])([0-9])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
                    $e{zip} = $1.$2.$3.$4.$5.$6.$7;
                    $e{zips} = $1.$2.$3.$4.' '.$5.$6.$7;
            }
0 голосов
/ 25 апреля 2018

Якорям ^ и $ требуется, чтобы шаблон соответствовал всей строке. Вы можете заключить шаблон в \b(?:<pattern>)\b, чтобы сопоставить эти коды как целые слова (\b - это граница слова). Кроме того, классы персонажей «разрушены», так как вы избежали их [ начальной скобки (\[ соответствует буквальному [ символам). Также, поменяйте местами аргументы, первый ввод, второй - регулярное выражение. Кроме того, чтобы получить все совпадения, вам нужно использовать str_extract_all вместо str_extract.

Вы можете исправить код следующим образом:

library(stringr)
txt <- "8, Longbow Close,\r\nHarlescott Lane,\r\nShrewsbury,\r\nEngland,\r\nSY1 3GZ"
pattern <- "\\b(?:([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))\\s?[0-9][A-Za-z]{2}))\\b"
str_extract_all(txt, pattern)
# => [[1]]
#   [1] "SY1 3GZ"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...