如何使用常见的前一个模式从字符串中提取字符?

时间:2017-12-01 05:32:26

标签: r regex substring

我正在尝试使用子函数将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

2 个答案:

答案 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"

Demo

答案 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_extractsub已经过矢量化,因此以下工作

strings <- c(string1, string2)
str_extract(strings, "(?<=ParNum:)[^[:blank:]]*")
# [1] "0511552031" "0511552031"
sub(".*ParNum:([^[:blank:]]*).*", "\\1", strings)
# [1] "0511552031" "0511552031"

模式(?<=)是lookbehind的正则表达式。这个site提供了有关外观的更多信息。