r-有没有一种方法可以选择性地应用这个字符串函数



我有一个用户的数据框架,其中一列包含他们自己报告的位置。因此,报告的一些位置是无意义的,但当将该列与已知位置的其他列匹配时,可能会导致误报。以下是数据帧的示例。

data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL", "Mobile,AL", "ALL OVER"))

有了这些数据,我运行下面的代码来建立与AL的匹配。

library(stringr)
data$match_ab <- str_extract(data[,2], str_c("AL", collapse = "|"))

这导致Huntsville和Mobile被正确地识别为阳性,但由于字符串中的ALALL OVER的第三个匹配被错误地识别为匹配。

有没有一种方法可以调整这个脚本,使其检测字符串中的匹配,同时忽略字符串中所需部分附加了字母的字符串?换句话说,当部分字符串的两侧可能有空格或标点符号时,这是否可以检测到AL,而如果字母表中的字母与字符串相邻,则忽略匹配?

提前谢谢。

如果我理解正确,这对你有用吗:

data$match_ab <- str_extract(data[,2], "\bAL\b")

使用\b,这是一个边界条件,因此如果后面/前面有一个单词或根据文档:符号\b与单词两边的空字符串匹配

只需对特定位置的匹配进行一点调整:在search_item之后添加$,这是一个正则表达式,用于指定:如果仅在字符串末尾,则需要进行匹配。

data$match_ab <- str_extract(data[,2], str_c("AL$", collapse = "|")); data;
X              Y match_ab
1 1                    <NA>
2 2 Washington, DC     <NA>
3 3 Huntsville, AL       AL
4 4      Mobile,AL       AL
5 5       ALL OVER     <NA>

假设AL位于字符串的中间,那么这可能更通用:

data <- data.frame(X = (1:5), Y = c("", "Washington, DC", "Huntsville, AL, 
SOMETHING_AT_THE_END", "Mobile,AL", "ALL OVER")); data;
X                                    Y
1 1                                     
2 2                       Washington, DC
3 3 Huntsville, AL, SOMETHING_AT_THE_END
4 4                            Mobile,AL
5 5                             ALL OVER
data$match_ab <- str_extract(data[,2], str_c("AL(?!L)", collapse = "|")); data;
X                                    Y match_ab
1 1                                          <NA>
2 2                       Washington, DC     <NA>
3 3 Huntsville, AL, SOMETHING_AT_THE_END       AL
4 4                            Mobile,AL       AL
5 5                             ALL OVER     <NA>

其中(?!L)表示不是!,后面跟着?L

我们也可以使用stringi中的stri_extract

library(stringi)
data$match_ab <- stri_extract(data[,2], regex = "\bAL\b") 

最新更新