R - 提取中的正则表达式只匹配

时间:2017-07-27 12:20:40

标签: r regex

我的字符串如下所示:

crb_gdp_g_100000_16_16_ftv_all.txt
crb_gdp_g_100000_16_20_fweo2_all.txt
crb_gdp_g_100000_4_40_fweo2_galt_1.txt

我只想提取f和下面的下划线之间的部分(在这三种情况下" tv"," weo2"和" weo2")。

我的正则表达式是:

regex.f = "_f([[:alnum:]]+)_"

没有与该模式匹配的多个部件的字符串。为什么以下命令不起作用?

sub(regex.f, "\\1", "crb_gdp_g_100000_16_16_ftv_all.txt")

该命令仅删除" _f"从字符串中返回剩余的字符串。

5 个答案:

答案 0 :(得分:4)

可以轻松获得qdapRegex

df <- c("crb_gdp_g_100000_16_16_ftv_all.txt", 
"crb_gdp_g_100000_16_20_fweo2_all.txt", 
"crb_gdp_g_100000_4_40_fweo2_galt_1.txt")

library(qdapRegex)
rm_between(df, "_f", "_", extract=TRUE)

答案 1 :(得分:2)

我们可以使用sub通过匹配字符f后跟一个或多个不是下划线或数字([^_0-9]+)的字符来提取字符串,捕获为一个组({ {1}}),后跟0个或更多数字((...)),后跟\\d*和其他字符。替换为捕获的组的反向引用(_

\\1

数据

sub(".*_f([^_0-9]+)\\d*_.*", "\\1", str1)
#[1] "tv"  "weo" "weo"

答案 2 :(得分:2)

我通常用于在两个字符之间提取文本的正则表达式来自https://stackoverflow.com/a/13499594/1017276,它专门用于在括号中提取文本。此方法仅将括号更改为f_

x <- c("crb_gdp_g_100000_16_16_ftv_all.txt",
       "crb_gdp_g_100000_16_20_fweo2_all.xml",
       "crb_gdp_g_100000_4_40_fweo2_galt_1.txt",
       "crb_gdp_g_100000_20_tbf_16_nqa_8_flin_galt_2.xml")

regmatches(x,gregexpr("(?<=_f).*?(?=_)", x, perl=TRUE))

或使用stringr包。

library(stringr)

str_extract(x, "(?<=_f).*?(?=_)")

已在 _f 上编辑以开始匹配,而不是 f

注意

akrun的答案比stringr方法快几毫秒,比base方法快十倍。对于10,000个元素的字符向量,base方法的时钟约为100毫秒。

答案 3 :(得分:1)

更新:使用str_match

捕获匹配
library(stringr)  
m <- str_match("crb_gdp_g_100000_16_20_fweo2_all.txt", "_f([[:alnum:]]+)_")
print(m[[2]])
# weo2

你的正则表达式不起作用,因为缺少开始和结束匹配.*并使用\w表示速记[:alnum:]

sub(".*_f(\\w+?)_.*", "\\1", "crb_gdp_g_100000_16_20_fweo2_all.txt")

答案 4 :(得分:0)

我们可以使用软件包 unglue

library(unglue)
txt <- c("crb_gdp_g_100000_16_16_ftv_all.txt", 
       "crb_gdp_g_100000_16_20_fweo2_all.txt", 
       "crb_gdp_g_100000_4_40_fweo2_galt_1.txt")

pattern <-
  "crb_gdp_g_100000_{=\\d+}_{=\\d+}_f{x}_{=.+?}.txt"
unglue_vec(txt,pattern)
#> [1] "tv"   "weo2" "weo2"

reprex package(v0.3.0)于2019-10-09创建

相关问题