R 使用正则表达式提取特定字符串

R 使用正则表达式提取特定字符串,r,regex,R,Regex,我有一个包含字符串和POS标记的数据包。我想通过过滤特定的POS标签来提取特定的字符串 举个简单的例子,我想提取以“NN-NN-NN”和“VB-JJ-NN”为基数的字符串 你不需要正则表达式。可以使用stringdist-软件包中的amatch-功能: vec <- c("NN-NN-NN", "VB-JJ-NN") library(stringdist) df[!!amatch(df$pos_tag, vec, maxDist = 1, nomatch = 0),] 它的作用是:

我有一个包含字符串和POS标记的数据包。我想通过过滤特定的POS标签来提取特定的字符串

举个简单的例子,我想提取以“NN-NN-NN”和“VB-JJ-NN”为基数的字符串


你不需要正则表达式。可以使用
stringdist
-软件包中的
amatch
-功能:

vec <- c("NN-NN-NN", "VB-JJ-NN")

library(stringdist)
df[!!amatch(df$pos_tag, vec, maxDist = 1, nomatch = 0),]
它的作用是:

  • amatch(df$pos_标记,vec,maxDist=1,nomatch=0)
    查看
    df$pos_标记
    中的值是否与
    vec
    中的值匹配,并具有指定的差异公差
  • 在本例中,我使用了1个字符的最大允许编辑距离:
    maxDist=1
  • 通过双重否定,
    创建一个逻辑向量,指示
    pos\u标记
    (几乎)是否与vec中的一个值匹配。另一种选择是:
    df[amatch(df$pos_标签,vec,maxDist=1,nomatch=0)>0,]

您也可以在基本R中使用
agrep
/
agrepl
并结合
sapply
/
lappy
行和
/
取消列表

# method 1:
df[rowSums(sapply(vec, function(x) agrepl(x, df$pos_tag, max.distance = 1))) > 0,]

# method 2:
df[unlist(lapply(vec, function(x) agrep(x, df$pos_tag, max.distance = 1))),]

两者都会给你相同的结果。

在预期的u have
NNS-NN-NN
模式不清晰问题不是很清楚。让我看看我是否理解了:您希望从word中获取“I”元素,并将其与pos_标记中的“I”元素相匹配,将从1到“I”的行写入文件/控制台,其中“I”代表循环索引控件。您还需要打印行号。这就是你想要的吗?哇~这真是一个有效的方法。我已经在我的过程中使用了这种方法。但这表明了另一个问题。因为在我的数据中也有诸如“in-NN-NN”、“VB-RB-in”、“NN-in-NN”等pos标签。(很抱歉,我没有在示例df中显示所有pos标记)。因此,当我使用amatch()时,它还会提取我不想要的其他模式。@Eva这取决于您有多少“假”匹配,但有一种可能性是使用
过滤掉假匹配!df$pos_标签%c(“in-NN-NN”、“VB-RB-in”、“NN-in-NN”)
               word              pos_tag
1   abrasion process management  NN-NN-NN
2    slurries comprise abrasive  NNS-NN-NN
3 slurry compositions comprise   NN-NNS-NN
4           keep high polishing  VB-JJ-NN
5   improved superabrasive grit  VBN-JJ-NN
6      using ceriacoated silica  VBG-JJ-NN
vec <- c("NN-NN-NN", "VB-JJ-NN")

library(stringdist)
df[!!amatch(df$pos_tag, vec, maxDist = 1, nomatch = 0),]
                           word   pos_tag
1   abrasion process management  NN-NN-NN
2    slurries comprise abrasive NNS-NN-NN
3 slurry compositions comprise  NN-NNS-NN
4           keep high polishing  VB-JJ-NN
5   improved superabrasive grit VBN-JJ-NN
6      using ceriacoated silica VBG-JJ-NN
# method 1:
df[rowSums(sapply(vec, function(x) agrepl(x, df$pos_tag, max.distance = 1))) > 0,]

# method 2:
df[unlist(lapply(vec, function(x) agrep(x, df$pos_tag, max.distance = 1))),]