R忽略正则表达式字符串中的字符

时间:2017-11-30 21:52:23

标签: r regex string replace ignore

我已经查看了一些regex会导致R忽略正则表达式字符串中的下一个字符。

例如,给定myvector

 myvector <- c("abcdef", "ghijkl", "mnopqrs")

regex字符串:

 regexstring <- "[a-z]{3}XXXXXXXXX "

包含一些未知字符XXXXXXXXX,我想告诉R忽略正则表达式字符串本身的最后一个空格。

运行以下内容后,

regexstring <- "[a-z]{3} "
sub(regexstring, " ", myvector)

给出,

"abcdef"  "ghijkl"  "mnopqrs"

因为任何字符串中都没有空格。但希望在包含XXXXXXXXX后,我会获得与运行时相同的输出

regexstring <- "[a-z]{3}"
sub(regexstring, " ", myvector)

是:

 " def"  " jkl"  " pqrs"

我无法删除最后的空间或使用trimws()等,而且我没有看到一种方法可以让R无视最后的空间。是否有任何XXXXXXXXX这样做?谢谢。

2 个答案:

答案 0 :(得分:2)

通过使用(?x) free-spacing inline modifier代替XXX s,最终空格可以成为格式化空间,并传递perl=TRUE参数以确保使用PCRE正则表达式解析模式发动机。

myvector <- c("abcdef", "ghijkl", "mnopqrs")
regexstring <- "[a-z]{3}(?x) "
sub(regexstring, " ", myvector, perl=TRUE) 
## => [1] " def"  " jkl"  " pqrs"

请参阅R demo

请注意,在模式中间放置(?x)会影响在之后(右侧)使用 空格的任何文字空格模式,直到模式结束,或直到(?-x)修饰符选项。

答案 1 :(得分:1)

基于Wiktor Stribizew的回答,我能够弄清楚如何用stringr做到这一点:

require(stringr)
myvector    <- c("abcdef", "ghijkl", "mnopqrs")
regexstring <- regex("[a-z]{3}# ", comments = T)
myvector %>% str_replace(regexstring, " ")

[1] " def"  " jkl"  " pqrs"

这样,我就可以修改正则表达式字符串本身(regexstring)而不是替换命令(sub或str_replace)。