是否可以在 R 中为正则表达式子字符串提供一组选项



我有一个数据帧,其中包含一些带有错误消息的单元格作为字符串。字符串采用以下形式:

ERROR-100_Data not found for ID "xxx"
ERROR-100_Data not found for id "xxx"
ERROR-101_Data not found for SUBID "yyy"
Data not found for ID "xxx"
Data not found for id "xxx"

我需要提取错误的编号(如果有的话(和一般描述,避免 ID 或 SUBID 的特殊性。我有一个函数,我使用以下正则表达式:

sub(".*?ERROR-(.*?)for ID.*","\1",df[,col1],sep="-")

这仅适用于第一种情况。有没有办法只使用一个表达式来获得以下结果?

100_Data not found
100_Data not found
101_Data not found
Data not found
Data not found

我们可以使用:

tsxt <- 'ERROR-100_Data not found for ID "xxx"'
    gsub("\sfor.*|ERROR-","",tsxt, perl=TRUE)
   [1] "101_Data not found"

或者按照@Jan锚ERROR的建议使其更通用:

gsub("\sfor.*|^ERROR-","",tsxt, perl=TRUE)

您可以使用

^ERROR-|sfor.+

需要用空字符串替换,请参阅 regex101.com 上的演示

使用此正则表达式:

.*?(?:ERROR-)?(.*?)s+fors+(?:[A-Z]*)?ID

这可确保ERROR-部分是可选的,然后在遇到for ...ID之前捕获所有内容(不区分大小写(。唯一的捕获组包含所需的文本,然后可以直接使用这些文本,而无需任何替换。

此正则表达式中的第一组和第三组是非捕获组,即,它们将匹配其内容但不捕获它以供进一步使用,因此我们只有一个捕获组(中间一个(。这样做是因为 OP 对他们引用的数据不感兴趣。将它们作为捕获组将意味着三个结果,而后处理将仅涉及硬编码第二组(中间组(的用法,而不必处理其他两个。

演示

最新更新