从R中的字符串中提取以동结尾的单词(可变长度)
extracting a word (of variable length) ending with 동 from a string in R
我在 R 中有一个数据框,其中一列包含韩语地址。我需要提取其中一个单词(以 동 结尾的单词),如果它存在(它可能丢失了)并创建一个名为 "dong" 的新列来包含该单词。所以我的数据显示在 "address" 列中,所需的输出显示在下面显示的 "dong" 列中。
address <- c("대전광역시 서구 탄방동 홈플러스","대전광역시 동구 효동 주민센터","대전광역시 대덕구 오정동 한남마트","대전광역시 동구 자양동 87-3번지 성동경로당","대전광역시 유성구 용계로 128")
dong <- c("탄방동","효동","오정동","자양동",NA)
data <- data.frame(address,dong, stringsAsFactors = FALSE)
我试过使用 grep,但它并没有提供我所需要的东西。
grep(".+동\s",data$address,value=T)
我认为我有 2 个问题:1) 我不确定如何编写正确的正则表达式来识别我需要的单词,以及 2) 我不确定为什么 grep returns 整个字符串而不是这个词。我将不胜感激任何建议。
grep
returns 整个字符串。在您的情况下,stringr
库很有用。
library(stringr)
str_match(paste0(data$address, ' '), '([^\s]+동)\s')
[,1] [,2]
[1,] "탄방동 " "탄방동"
[2,] "효동 " "효동"
[3,] "오정동 " "오정동"
[4,] "자양동 " "자양동"
[5,] NA NA
第2列就是你想要的。请注意,我在字符串的末尾添加了一个 space,这样如果 "dong" 出现在字符串的末尾,正则表达式就会匹配。
提取以特定字母结尾的整个韩语单词的正则表达式是
\b\w*동\b
参见regex demo。
详情:
\b
- 前导词边界
\w*
- 0+ 个单词字符
동
- 结尾字母
\b
- 尾随单词边界
参见R demo:
address <- c("대전광역시 서구 탄방동 홈플러스","대전광역시 동구 효동 주민센터","대전광역시 대덕구 오정동 한남마트","대전광역시 동구 자양동 87-3번지 성동경로당","대전광역시 유성구 용계로 128")
## matches <- regmatches(address, gregexpr("\b\w*동\b", address, perl=TRUE ))
matches <- regmatches(address, gregexpr("\b\w*동\b", address ))
dong <- unlist(lapply(matches, function(x) if (length(x) == 0) NA else x))
data <- data.frame(address,dong, stringsAsFactors = FALSE)
输出:
address dong
1 대전광역시 서구 탄방동 홈플러스 탄방동
2 대전광역시 동구 효동 주민센터 효동
3 대전광역시 대덕구 오정동 한남마트 오정동
4 대전광역시 동구 자양동 87-3번지 성동경로당 자양동
5 대전광역시 유성구 용계로 128 <NA>
请注意,dong <- unlist(lapply(matches, function(x) if (length(x) == 0) NA else x))
行是将 NA 添加到未找到匹配项的那些行所必需的。
我在 R 中有一个数据框,其中一列包含韩语地址。我需要提取其中一个单词(以 동 结尾的单词),如果它存在(它可能丢失了)并创建一个名为 "dong" 的新列来包含该单词。所以我的数据显示在 "address" 列中,所需的输出显示在下面显示的 "dong" 列中。
address <- c("대전광역시 서구 탄방동 홈플러스","대전광역시 동구 효동 주민센터","대전광역시 대덕구 오정동 한남마트","대전광역시 동구 자양동 87-3번지 성동경로당","대전광역시 유성구 용계로 128")
dong <- c("탄방동","효동","오정동","자양동",NA)
data <- data.frame(address,dong, stringsAsFactors = FALSE)
我试过使用 grep,但它并没有提供我所需要的东西。
grep(".+동\s",data$address,value=T)
我认为我有 2 个问题:1) 我不确定如何编写正确的正则表达式来识别我需要的单词,以及 2) 我不确定为什么 grep returns 整个字符串而不是这个词。我将不胜感激任何建议。
grep
returns 整个字符串。在您的情况下,stringr
库很有用。
library(stringr)
str_match(paste0(data$address, ' '), '([^\s]+동)\s')
[,1] [,2]
[1,] "탄방동 " "탄방동"
[2,] "효동 " "효동"
[3,] "오정동 " "오정동"
[4,] "자양동 " "자양동"
[5,] NA NA
第2列就是你想要的。请注意,我在字符串的末尾添加了一个 space,这样如果 "dong" 出现在字符串的末尾,正则表达式就会匹配。
提取以特定字母结尾的整个韩语单词的正则表达式是
\b\w*동\b
参见regex demo。
详情:
\b
- 前导词边界\w*
- 0+ 个单词字符동
- 结尾字母\b
- 尾随单词边界
参见R demo:
address <- c("대전광역시 서구 탄방동 홈플러스","대전광역시 동구 효동 주민센터","대전광역시 대덕구 오정동 한남마트","대전광역시 동구 자양동 87-3번지 성동경로당","대전광역시 유성구 용계로 128")
## matches <- regmatches(address, gregexpr("\b\w*동\b", address, perl=TRUE ))
matches <- regmatches(address, gregexpr("\b\w*동\b", address ))
dong <- unlist(lapply(matches, function(x) if (length(x) == 0) NA else x))
data <- data.frame(address,dong, stringsAsFactors = FALSE)
输出:
address dong
1 대전광역시 서구 탄방동 홈플러스 탄방동
2 대전광역시 동구 효동 주민센터 효동
3 대전광역시 대덕구 오정동 한남마트 오정동
4 대전광역시 동구 자양동 87-3번지 성동경로당 자양동
5 대전광역시 유성구 용계로 128 <NA>
请注意,dong <- unlist(lapply(matches, function(x) if (length(x) == 0) NA else x))
行是将 NA 添加到未找到匹配项的那些行所必需的。