一个示例向量:
string <- "Junk1_Junk2_Junk3__ID1_Junk4_Junk5.pdf"
我试图通过从右边数 _
(下划线)来对 ID1
进行子集化;所以从右边数第二个和第三个下划线之间的子集。
预期输出:ID1
我的尝试是尝试使用双__
,
但这行不通,因为并非我的所有字符串列表都有它。
尝试:(_){2}([^_]+)
旁注,我正在努力适应正则表达式;请推荐一个资源来构建和测试。
感谢任何帮助。
最佳答案
你可以使用
library(stringr)
stringr::str_extract(string, "[^_]+(?=(?:_[^_]*){2}$)")
或者,与基础 R 相同的方法:
## Base R:
sub(".*?([^_]+)(?:_[^_]*){2}$", "\\1", string)
参见 regex demo和 R demo online .
详细信息:
-
[^_]+
- 除_
以外的一个或多个字符 -
(?=(?:_[^_]*){2}$)
- 需要两个_
序列的正前瞻然后是除_
之外的任何字符的零次或多次重复直到字符串结束 -
.*?([^_]+)(?:_[^_]*){2}$
火柴-
.*?
- 任何零个或多个字符,尽可能少 -
([^_]+)
- 捕获组 1(替换模式中的\1
指的是这个捕获的字符串):除_
之外的一个或多个字符 -
(?:_[^_]*){2}
-_
的两个序列然后是除_
之外的任何字符的零次或多次重复 -
$
- 字符串结束。
-
关于正则表达式帮助,基于字符串末尾第 n 次出现的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69981998/