正则表达式向前看断言

时间:2015-07-21 14:09:27

标签: regex r

我需要regex专家来解决这个问题。它与我遗失的SO问题有关,数据如下:

x = c("IID:WE:G12D/V/A", "GH:SQ:p.R172W/G", "HH:WG:p.S122F/H")

我需要拆分x的每个元素以隔离可以由letter - slash - letter - .... slash - letter构成的结尾部分。 我想要的是获得这两个向量作为输出:

o1 = c("IID:WE:G12", "GH:SQ:p.R172", "HH:WG:p.S122")
o2 = c("D/V/A", "W/G", "F/H")

我有o1的解决方案:

gsub('[A-Z]/.+','',x)
#[1] "IID:WE:G12"   "GH:SQ:p.R172" "HH:WG:p.S122"

好。对于o2,我尝试使用断言,特别是前瞻断言:

gsub('.+(?=[A-Z]/.+)','',x, perl=T)
#[1] "V/A" "W/G" "F/H"

但这不是想要的结果!

知道第二个正则表达式出了什么问题吗?

3 个答案:

答案 0 :(得分:3)

作为一种可能的解决方案,您可以使用以下替代品:

gsub('.*?([^/](?:/[^/])+)$','\\1',x, perl=T)

或(如果必须有一封信):

gsub('.*?([A-Z](?:/[A-Z])+)$','\\1',x, perl=T)

请参阅IDEONE demo

  • .*? - 从一开始就匹配尽可能少的字符
  • ([^/](?:/[^/])+) - 匹配的捕获组:
    • [^/] - /以外的字符(或 - 如果[A-Z] - 任何英文大写字母)
    • (?:/[^/])+ - 一个或多个/序列和/以外的字符(如果使用[A-Z],则为大写字母)。
  • $ - 字符串结尾

答案 1 :(得分:3)

以下内容非常接近您提出的内容:

gsub('[^/]+(?=[A-Z]/.+)','',x, perl=T)

(你的线路没有用,因为你要求"任何角色",其中包括" \")

答案 2 :(得分:1)

试试这个:

gsub('\\w(?=\\/).*','',x,perl=T)

gsub('.*\\d(?=\\w\\/)','',x, perl=T)  #For O2

正则表达式展望未来:

int func(int angle) {
    return ((((angle + 180) % 360) + 360) % 360) - 180;
}