用于识别英国邮政编码的 R 正则表达式
R Regex for identifying UK postcodes
我的问题类似于 this,但我正在寻找 R
具体的问题。我有数万个地址的data.frame,需要提取邮政编码。邮政编码在英国,格式为 {LETTER_LETTER_DIGIT LETTER_LETTER_DIGIT}。类似于以下内容:
"8,长弓关闭,\r\nHarlescott里,\r\nShrewsbury,\r\nEngland,\r\nSY13GZ"
我已经使用此代码的变体 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)
^
和 $
锚点要求模式匹配整个字符串。您可以用 \b(?:<pattern>)\b
包装模式以将这些代码匹配为整个单词(\b
是单词边界)。此外,字符 类 是 "ruined" 因为你转义了他们的 [
起始括号(\[
匹配文字 [
字符)。另外,交换参数,第一个是输入,第二个是正则表达式。此外,要获得所有匹配项,您需要使用 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"
这里有一个更易读的方式:
if ($e{locate} =~ /\b([A-Z])([A-Z])([0-9])([A-Z]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = ......;
$e{zips} = ....' ' ...;
} elsif ($e{locate} =~ /\b([A-Z])([0-9])([A-Z]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = .....;
$e{zips} = ...' '...;
} elsif ($e{locate} =~ /\b([A-Z])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = ....;
$e{zips} = ..' '...;
} elsif ($e{locate} =~ /\b([A-Z])([0-9])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = .....;
$e{zips} = ...' '...;
} elsif ($e{locate} =~ /\b([A-Z])([A-Z])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = .....;
$e{zips} = ...' ' ...;
} elsif ($e{locate} =~ /\b([A-Z])([A-Z])([0-9])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = ......;
$e{zips} = ....' '...;
}
我的问题类似于 this,但我正在寻找 R
具体的问题。我有数万个地址的data.frame,需要提取邮政编码。邮政编码在英国,格式为 {LETTER_LETTER_DIGIT LETTER_LETTER_DIGIT}。类似于以下内容:
"8,长弓关闭,\r\nHarlescott里,\r\nShrewsbury,\r\nEngland,\r\nSY13GZ"
我已经使用此代码的变体 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)
^
和 $
锚点要求模式匹配整个字符串。您可以用 \b(?:<pattern>)\b
包装模式以将这些代码匹配为整个单词(\b
是单词边界)。此外,字符 类 是 "ruined" 因为你转义了他们的 [
起始括号(\[
匹配文字 [
字符)。另外,交换参数,第一个是输入,第二个是正则表达式。此外,要获得所有匹配项,您需要使用 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"
这里有一个更易读的方式:
if ($e{locate} =~ /\b([A-Z])([A-Z])([0-9])([A-Z]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = ......;
$e{zips} = ....' ' ...;
} elsif ($e{locate} =~ /\b([A-Z])([0-9])([A-Z]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = .....;
$e{zips} = ...' '...;
} elsif ($e{locate} =~ /\b([A-Z])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = ....;
$e{zips} = ..' '...;
} elsif ($e{locate} =~ /\b([A-Z])([0-9])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = .....;
$e{zips} = ...' '...;
} elsif ($e{locate} =~ /\b([A-Z])([A-Z])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = .....;
$e{zips} = ...' ' ...;
} elsif ($e{locate} =~ /\b([A-Z])([A-Z])([0-9])([0-9]) ([0-9])([A-Z])([A-Z])\b/) {
$e{zip} = ......;
$e{zips} = ....' '...;
}