【问题标题】:Regular expresion with exceptions有异常的正则表达式
【发布时间】:2020-06-25 20:40:43
【问题描述】:

我想知道向量中是否有模式,可以说:

vector <- c(paste0(paste("MC", 1:25), c(rep("", 10), rep("-P1",10), rep("P1",5))), rep("RANDOM", 10),c("MC1","MC2","MC-3"), rep("MCRANDOM", 10))
vector

我想要带有“MC”的那些,后面跟着一个数字。它们之间可以是数字,也可以是连字符或空格,然后是数字。我想排除那些是较大代码的一部分,即带有 P 和另一个数字的代码,例如:“MC 20-P1”“MC 21P1”。 这会检测带有 MC 和编号的那些:

vector[grepl("MC( |-)*[0-9]{1,}", vector)]

我尝试使用^进行排除,但我的尝试失败了:

vector[grepl("MC( |-)*[0-9]{1,}[^(-*)P]", vector)]

我怎样才能只匹配带有 MC 和数字的那些? (在我的真实数据中是较大文本的一部分)

【问题讨论】:

  • 请联系grep("^MC[- ]\\d+", vector, value = TRUE)
  • 不,我只需要:"MC 1" "MC 2" "MC 3" "MC 4" "MC 5" "MC 6" "MC 7" "MC 8" "MC 9" "MC 10"
  • ` 在这些之间可以是数字,也可以是连字符或空格,然后是数字。` 所以不想要MC-3grep("^MC[- ]\\d+$", vector, value = TRUE)
  • 哦,我忘了,是的,我也想要那些
  • 我的示例中没有,但有类似:“MC-1”“MC-2”。我想排除像“MC 16-P1”和“MC 24P1”这样的人

标签: r regex grepl


【解决方案1】:

我们可以在这里指定开始(^)和结束($)来匹配以'MC'开头的字符串,后跟空格或-,然后是一个或多个数字(\\d+)直到结束

grep("^MC[- ]?\\d+$", vector, value = TRUE)
#[1] "MC 1"  "MC 2"  "MC 3"  "MC 4"  "MC 5"  "MC 6"  
#[7] "MC 7"  "MC 8"  "MC 9"  "MC 10" "MC1"   "MC2"   "MC-3" 

如果 MC 可以是子字符串,则使用字边界 (\\b) 代替 ^

【讨论】:

  • 几乎可以完成这项工作,但是,我也想要那些像:“MC2”“MC3”
猜你喜欢
  • 2012-04-20
  • 2022-11-14
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
相关资源
最近更新 更多