【发布时间】:2014-08-09 22:40:12
【问题描述】:
我正在尝试从字符串中删除/提取邮政编码。逻辑是我正在抓取的东西是:
- 必须恰好包含 5 个连续数字或
- 必须包含 5 个连续数字,后跟一个短划线,然后是 4 个连续数字或
- 必须包含 5 个连续数字,后跟一个空格,然后是 4 个连续数字
字符串的 zip 部分可以以空格开头,但也可以不。
这是 MWE 和我尝试过的。 2 个尝试的正则表达式基于 this question 和 this question:
text.var <- c("Mr. Bean bought 2 tickets 2-613-213-4567",
"43 Butter Rd, Brossard QC K0A 3P0 – 613 213 4567",
"Rat Race, XX, 12345",
"Ignore phone numbers(613)2134567",
"Grab zips with dashes 12345-6789 or no space before12345-6789",
"Grab zips with spaces 12345 6789 or no space before12345 6789",
"I like 1234567 dogs"
)
pattern1 <- "\\d{5}([- ]*\\d{4})?"
pattern2 <- "[0-9]{5}(-[0-9]{4})?(?!.*[0-9]{5}(-[0-9]{4})?)"
regmatches(text.var, gregexpr(pattern1, text.var, perl = TRUE))
regmatches(text.var, gregexpr(pattern2, text.var, perl = TRUE))
## [[1]]
## character(0)
##
## [[2]]
## character(0)
##
## [[3]]
## [1] "12345"
##
## [[4]]
## [1] "21345"
##
## [[5]]
## [1] "12345-6789"
##
## [[6]]
## [1] "12345"
##
## [[7]]
## [1] "12345"
期望的输出
## [[1]]
## character(0)
##
## [[2]]
## character(0)
##
## [[3]]
## [1] "12345"
##
## [[4]]
## character(0)
##
## [[5]]
## [1] "12345-6789" "12345-6789"
##
## [[6]]
## [1] "12345 6789" "12345 6789"
##
## [[7]]
## character(0)
注意 R 的正则表达式与其他正则表达式类似,但是是 R 特有的。这个问题是 R 的正则表达式特有的,而不是一般的正则表达式问题。
【问题讨论】:
-
我不确定这张纸条。例如,当您使用
perl=TRUE时,您也可以使用 perl 正则表达式,因此通常经典的正则表达式是 R 解决方案。 -
@agstudy 更多关于加倍反斜杠和任何其他 R 特定正则表达式的东西(我不太了解正则表达式,不知道这些东西是什么,但我找到了非 R 用户' 正则表达式通常不会转换为 R)。