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