从非结构化文本中提取字符串值

时间:2015-10-02 19:34:36

标签: regex r

我正在处理数据,其结构是将单个字段用于多种用途。我有超过1万条记录需要处理,我需要在dataFrame的不同字段中提取具有意义的特定系列字符。我需要从中提取出一种可预测的模式;下面是一个例子:

x = "This field has lots of text and also what I need to extract from it which is 555_AB345678"

我需要提取的是555_AB345678值。前3个值(555)和下划线都是可预测的; AB345678不是。但是,至少字符串的最后4个值始终为数字。我不能保证我想要的值是在字符串的末尾,但在大多数情况下它们是如此,我会满意从那里开始。

我已经探索过将gregexpr()与substring()一起使用,但尚未使用它。我在想strsplit()可以工作,但我没有可分割的分隔符(只是我需要的值中的可预测模式)。我也发现了类似的问题,但似乎没有一个符合我的标准。

extract a substring in R according to a pattern

我想看看这里是否有人就如何做到这一点提出建议。

2 个答案:

答案 0 :(得分:1)

基础R方式是使用这个复杂的提取器:

regmatches(x, regexpr("555_.*$", x))
# "555_AB345678"

$到字符串的末尾;和.*,任何字符序列(包括空字符)。

或者,我们可以用所需的部分替换整个字符串:

sub("^.*(555_.*)$", "\\1", x)
# "555_AB345678"

^是字符串的开头,因此我们现在匹配整个字符串,从^$\\1替换是指括号中的部分。有关详细信息,请参阅?regex。对于具有更好语法的提取器,您可以尝试使用stringr包:

library(stringr)
str_extract(x, "555_.*$")
# "555_AB345678"

答案 1 :(得分:0)

你有一个模式!

threeLeadingValues-underscore-something-threeDigits 就足以构成这个表达式:

/.{3}_.*\d{3}/

https://regex101.com/r/bD0pF2/2