我已经查看了一些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这样做?谢谢。
答案 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)。