【问题标题】:Filtering in R with punctuation characters用标点符号过滤R
【发布时间】:2016-01-05 10:44:23
【问题描述】:

我有一列数据集如下所示:

$abc.MSFT

$MSFT

$msft

$abcMSFTxyz

我想要以下输出:

$MSFT  

$msft

我的过滤尝试:

dplyr::filter(Tweets, grepl("\\bMMM$\\b", ignore.case = TRUE, V2))

返回:

$abc.MSFT

$MSFT

$msft

dplyr::filter(Tweets,grepl("^$MMM$", ignore.case = TRUE, V2))

返回:

【问题讨论】:

  • 试试grepl("^\\$msft$", ignore.case = TRUE, x)。美元符号是正则表达式中的特殊字符。如果要匹配文字 $,则必须使用反斜杠转义字符。
  • @ Pierre \\bMMM$\\b 有效,但它不能忽略字符串开头的标点符号。我希望它忽略除 $ 字符之外的所有其他标点符号。
  • @皮埃尔,好的,我会试试的。谢谢
  • 如果"\\bMMM$\\b""MSFT" 匹配,那么我对正则表达式一无所知,您应该是回答问题的人。我真的很想看到代码示例。 (不只是你说“它回来了..”)
  • @Pierre 感谢您的解决方案有效!

标签: regex r filter dplyr grepl


【解决方案1】:

一种方法:

x <- c("$abc.MSFT", "$MSFT", "$msft", "$abcMSFTxyz")
Tweets <- data.frame(V2=x, stringsAsFactors=F)
Tweets
#           V2
#1   $abc.MSFT
#2       $MSFT
#3       $msft
#4 $abcMSFTxyz

#your way
dplyr::filter(Tweets, grepl("\\bMMM$\\b", ignore.case = TRUE, V2))
[1] V2
<0 rows> (or 0-length row.names)

#another way
dplyr::filter(Tweets, grepl("^\\$msft$", ignore.case = TRUE, V2))
     V2
1 $MSFT
2 $msft

来自regex help

..有 12 个具有特殊含义的字符:反斜杠 \、 插入符号 ^、美元符号 $、句点或点 .、竖线或 管道符号 |、问号 ?、星号或星号 *、加号 符号 +、左括号 (、右括号 ) 和 左方括号 [,左大括号 {,这些特殊 字符通常被称为“元字符”。

然后修复:

如果您想在正则表达式中使用这些字符中的任何一个作为文字, 你需要用反斜杠转义它们。如果要匹配1+1=2, 正确的正则表达式是 1\\+1=2。否则,加号有一个特殊的 意思。

研究正则表达式。他们值得花时间学习你想编程的任何语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2015-09-20
    • 2018-03-02
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多