我正在尝试使用子函数将Parcel Number与凌乱的字符串变量隔离开来。包裹编号在字符串中由前面的“ParNum:”标识,所需数字周围的字符各不相同,但它们遵循这两个示例的一般形式。
string1 <- "Legal Description: PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
string2 <- "Legal Description: Rmrk:PT OF PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
悲惨的失败努力:
> sub("[^:]*:)*[^:]*:", "", string1)
[1] "0511552031 ParNum:0511552031 CC:05 T:7 R:8"
期望的结果:
0511552031
答案 0 :(得分:4)
尝试在sub
使用以下模式:
.*ParNum:([^[:blank:]]*).*
匹配ParNum:
,然后捕获 ParNum:
后的任何非空格/制表符。然后,捕获的数字在第一个捕获组中显示为\\1
。
代码段:
string1 <- "Legal Description: PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
sub(".*ParNum:([^[:blank:]]*).*", "\\1", string1)
[1] "0511552031"
答案 1 :(得分:1)
我发现使用stringr
中的tidyverse
包更容易。 (事实上,像这样的问题首先促使我安装stringr
)
library(stringr)
string1 <- "Legal Description: PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
string2 <- "Legal Description: Rmrk:PT OF PrpId:0511552031 ParNum:0511552031 CC:05 T:7 R:8"
str_extract(string1, "(?<=ParNum:)[^[:blank:]]*")
# [1] "0511552031"
此外,str_extract
和sub
已经过矢量化,因此以下工作
strings <- c(string1, string2)
str_extract(strings, "(?<=ParNum:)[^[:blank:]]*")
# [1] "0511552031" "0511552031"
sub(".*ParNum:([^[:blank:]]*).*", "\\1", strings)
# [1] "0511552031" "0511552031"
模式(?<=)
是lookbehind的正则表达式。这个site提供了有关外观的更多信息。