首页 > 解决方案 > 如何使用 OR 在正则表达式中的字符串操作的多个匹配项之间进行选择

问题描述

我在数据框的一列中有一堆字符串。字符串中有多个拼写错误,所以我想在一行代码中替换它们。数据框如下图所示:

comment <- c("3.3% 1AT $100000 AND 1.2% BALANCE", "3.3% 1DT $100000 AND 1.2% BALANCE" , 
+ "3.3% 1S $100000 AND 1.2% BALANCE", "3.3% 1SST $100000 AND 1.2% BALANCE", "3.3% 1S T$100000 AND 1.2% BALANCE")
df <- data.frame(comment)

                             comment
1  3.3% 1AT $100000 AND 1.2% BALANCE
2  3.3% 1DT $100000 AND 1.2% BALANCE
3   3.3% 1S $100000 AND 1.2% BALANCE
4 3.3% 1SST $100000 AND 1.2% BALANCE
5  3.3% 1S T$100000 AND 1.2% BALANCE

基本上,我想做的是用1ST替换1AT1DT1S1SST

我关注了这个链接我可以在正则表达式中使用 OR 而不捕获包含的内容吗?并编写了以下代码:

gsub("^(\\d\\.\\d%) (?: 1AT|1DT|1S|1SST) (\\$100000) AND (\\d\\.\\d%) BALANCE","\\1 1ST \\2 AND \\3 BALANCE", df$comment)

我了解此代码不会将“1S T$100000”更改为正确的甲酸盐,但我希望它适用于其他行。但是,此代码没有更改字符串。有什么问题吗?

标签: rregex

解决方案


我强烈建议不要使您的正则表达式过于复杂。在复杂性和特殊性之间找到一个快乐的媒介。也许是这样的:

gsub("% (1AT|1DT|1S|1SST) \$", "% 1ST $", comment)

除非您已经完成trimws()或类似操作,否则我发现正则表达式中的空格问题非常常见 - 多个空格或非标准空格字符。这将更加健壮:

gsub("%\\s+(1AT|1DT|1S|1SST)\\s+\\$", "% 1ST $", comment)

推荐阅读