regex gsub、前看和后看

sg3maiej  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(80)

我有一个string vector,包含:

Number of source1.2_SPNB.txt
Number of source1.1_SPNB.txt
Number of source1.3_SPNB.txt

字符串
我需要提取“source1.1”,“source1.2”和“source1.3”在一个新的向量。
this之后,我尝试了:

gsub("(?<=of )(.*)(?=_)", "\\1", string.vector)


但我得到一个错误:
正则表达式'(?<=of)(.*)(?=_)',reason '无效的regexp'
然后我试着:

gsub("(?<=of )(.*)(?=_)", "\\1", string.vector, perl = TRUE)


但它返回了完全相同的字符串向量。
我做错了什么?

ercv8c1e

ercv8c1e1#

有几个问题:

  • 使用lookahead/lookbehind需要perl = TRUE
  • 即使我们使用正则表达式,它所做的只是用它自己替换所需的子串-我们想要做的是匹配整个字符串(与使用零宽度lookahead/lookbehind相反),然后仅用匹配捕获组的部分替换整个字符串。
  • 假定只需要一个替换,因此应该使用sub,而不是gsub

解决这些问题,我们得到:

sub(".*(source.*?)_.*", "\\1", string.vector)

字符串

ee7vknir

ee7vknir2#

我们可以匹配字符,直到空格(.*\\s)或(|)后面跟着其他字符(.*)的_,并将其替换为空白(""

gsub(".*\\s|_.*", "", string.vector)
#[1] "source1.2" "source1.1" "source1.3"

字符串
或者如果我们需要抓捕小组

sub(".*\\sof\\s([^_]+).*", "\\1", string.vector)
#[1] "source1.2" "source1.1" "source1.3"


对于提取目的,最好使用来自stringrstr_extract或来自base Rregmatches/regexpr

regmatches(string.vector, regexpr("(?<=of )([^_]+)(?=_)", string.vector, perl = TRUE))
#[1] "source1.2" "source1.1" "source1.3"

数据

string.vector <- c("Number of source1.2_SPNB.txt", "Number of source1.1_SPNB.txt", 
             "Number of source1.3_SPNB.txt")

相关问题