在R中第二个短划线和第一个闪光之间保持文字

时间:2018-03-22 14:43:14

标签: r regex string

我有一个字符串向量,如下所示:

a - bc/def_g  - A/mn/us/ww
opq - rs/ts_uf - BC/wx/yza
Abc - so/dhie7u - XYZ/En/xy/jkq - QWNE

我希望在第二个短划线( - )之后但在第一个闪光(/)之前得到文本,即结果看起来像

A
BC
XYZ

最好的方法是什么(矢量的行数超过500K。)

谢谢

2 个答案:

答案 0 :(得分:1)

假设您的字符串定义如下:

string <- c("a - bc/def_g  - A/mn/us/ww", 
            "opq - rs/ts_uf - BC/wx/yza", 
            "Abc - so/dhie7u - XYZ/En/xy/jkq - QWNE")

然后您可以使用sub

> sub(".*\\-\\s+([A-Z]+)/.*", "\\1", string)
[1] "A"   "BC"  "XYZ"

答案 1 :(得分:1)

See regex in use here

^[^-]*-[^-]*-\s*\K[^/]+
  • ^在行首处断言位置
  • [^-]*匹配除-以外的任何字符
  • -按字面意思匹配
  • [^-]*匹配除-以外的任何字符
  • -按字面意思匹配
  • \s*匹配任意数量的空白字符
  • \K重置模式的起点。最终匹配中不再包含任何以前消费的字符
  • [^/]+匹配/除{/ 1}}之外的任何字符

或者,正如Jan在下面的评论中所建议的(我相信它已被删除),^(?:\[^-\]*-){2}\s*\K\[^/\]+可能会被使用。它更短,更容易扩展,但更多的步骤。

See code in use here

x <- c("a - bc/def_g  - A/mn/us/ww", "opq - rs/ts_uf - BC/wx/yza", "Abc - so/dhie7u - XYZ/En/xy/jkq - QWNE")
m <- regexpr("^[^-]*-[^-]*-\\s*\\K[^/]+", x, perl=T)
regmatches(x, m)

结果:[1] "A" "BC" "XYZ"