[R grepl - 匹配两个字符串
我与R.用grep/grepl功能面临的问题当我运行[R grepl - 匹配两个字符串
grepl("[Aa][Bb][Cc]x", c("Abcx", "abCy"))
我:
[1] TRUE FALSE
而且它的确定。同样,对于:
grepl("[Aa][Bb][Cc]y", c("Abcx", "abCy"))
我:
[1] FALSE TRUE
而且,这也是allrighty。但是,当我写:
grepl("[Aa][Bb][Cc]x | [Aa][Bb][Cc]y", c("Abcx", "abCy"))
它给了我反直觉
[1] FALSE FALSE
什么问题?
您需要删除围绕|
空间:
grepl("[Aa][Bb][Cc]x|[Aa][Bb][Cc]y", c("Abcx", "abCy"))
这些空间关系。您可以使用一个PCRE正则表达式虽然有(?x)
修饰符(请参见demo),使得它可以引入一些格式化空白的子模式之间进行更好的可读性:
grepl("(?x)[Aa][Bb][Cc]x | [Aa][Bb][Cc]y", c("Abcx", "abCy"), perl=TRUE)
或者更好地利用这个较短的版本:
grepl("[Aa][Bb][Cc][xy]", c("Abcx", "abCy"))
其中模式首先缩小到[Aa][Bb][Cc](x|y)
并且由于这些是单个字符,所以我推荐使用字符类((x|y)
- >[xy]
)。
谢谢!不过,我不明白,为什么它会在正则表达式中输入空格时考虑空格?或者它是真的,但只适用于perl式的表达式? – user2280549
请注意'\ s'代表的不仅仅是一个文字空间。它可以匹配空格,制表符,换行符,Unicode空格。默认情况下,文字空间是有意义的,但PCRE(带有'perl = TRUE'的base R)和ICU(stringr/stringi包)正则表达式风格中没有'(?x)'修饰符。 –
据我所知,“\ s”仅代表空格(与[:space:]相对) - >请参阅grepl(“\\ s”,“\\ t”) – user2280549
...删除'|'两边的空格吗? – joran
是的,在评论@ user22 – Frank
@joran后才意识到我的错误,谢谢!不过,我不明白,为什么它会在正则表达式中输入空格时考虑空格? – user2280549