我有一个数据帧,其中包含一些带有错误消息的单元格作为字符串。字符串采用以下形式:
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 对他们引用的数据不感兴趣。将它们作为捕获组将意味着三个结果,而后处理将仅涉及硬编码第二组(中间组(的用法,而不必处理其他两个。
演示