我有一个字符串向量,看起来像这样:
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 行。
谢谢
假设您的字符串定义如下:
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"
在此处查看正在使用的正则表达式
^[^-]*-[^-]*-s*K[^/]+
-
^
在行首断言位置 -
[^-]*
匹配除-
以外的任何字符任意次数 -
-
从字面上匹配 -
[^-]*
匹配除-
以外的任何字符任意次数 -
-
从字面上匹配这个 -
s*
匹配任意数量的空格字符 -
K
重置模式的起点。任何以前消耗的角色都不再包含在最终匹配中 -
[^/]+
匹配除/
以外的任何字符一次或多次
或者,正如 Jan 在下面的评论中建议的那样(我相信它已被删除(,可以使用^(?:[^-]*-){2}s*K[^/]+
。它更短且易于扩展,但更多增加了步骤。
在此处查看正在使用的代码
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"