在 R 中将文本保留在第二个破折号和第一个闪烁之间



我有一个字符串向量,看起来像这样:

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"

相关内容

最新更新