长度不一样的任何图案,

时间:2019-01-31 21:37:04

标签: r regex

使用Adobe Acrobat Pro将pdf表转换为excel,然后将其读入R,我正在修复列的所有元素(例如ID)以匹配pdf中的原始元素,因为该转换会带来一些问题。 (即5变成了S,8变成了B或S,0 O和D互换了,6变成了0,我变成了1,添加了空格,依此类推)到目前为止,我已经使用正则表达式修复了所有元素,有些还不能除了手动以外,将其修复,并使用更正重新创建Excel工作表。这是一个每月项目,将来可能会发生错误。我想创建一个正则表达式以查找仍然与所需模式不匹配的任何内容,并附加一个标记(即%或?或!)

所需图案遵循XYY图案,其中X分别为[A-T],Y分别为[0-2]和[0-9]。最低的是A01,最高的是T25。我想查找超出此“范围”或不正确的任何内容,然后添加标记。到目前为止,我已经尝试了以下方法。为了保密起见,我无法提供数据。

这是一个虚构的例子,应该可以理解这一点。

mydf <- data.frame(ID = c("A01", "J31", "K24", "L12", "T26", "810"))
mydf$ID <- gsub("(^[^A-T][02][0-9])", "\\1!", mydf$ID)

但是不会产生任何结果。 我也尝试使用这个:

!grepl("^[A-T][0-2][0-9]$", mydf$ID)

然后我可以标记所有不正确的ID。捕获到J31和810不正确,但是错过了T26作为不正确的ID。

您可以假定所有ID的长度相同,均为3个字符。 需要R代码。

2 个答案:

答案 0 :(得分:0)

这是一种使用否定环视的方法,它需要perl = TRUE中的gsub。基本上,我将您的模式更改为正匹配(需要开始,然后是AT,然后是0-1和0-9,或2和0-5,然后是结束字符),并包含?!表示不为了这。请注意,您在上方省略了一个连字符。但是,负的正则表达式并不总是很清楚,如果只使用正匹配的stringr::str_detectgrepl,然后取反逻辑向量用作指示符列,则可能更容易理解。 >

mydf <- data.frame(ID = c("A01", "J31", "K24", "L12", "T26", "810", "A012", "AA12"))
mydf$ID <- gsub("(^(?!^([A-T][0-1][0-9]|[A-T]2[0-5])$).*)", "\\1!", mydf$ID, perl = TRUE)
mydf$ID
#> [1] "A01"   "J31!"  "K24"   "L12"   "T26!"  "810!"  "A012!" "AA12!"

reprex package(v0.2.1)于2019-01-31创建

答案 1 :(得分:0)

我认为仅将它分为3种可能的情况就可以了。像这样:

mydf <- data.frame(ID = c("A01", "J31", "K24", "L12", "T26", "810"))
mydf$ID <- gsub("((?:[^A-T].{2})|(?:[A-T][3-9].)|(?:[A-T]2[6-9]))", "\\1!", mydf$ID)

请注意,这确实是假设有3位数字。