【问题标题】:regex to remove words that contains special character along with url in R正则表达式删除包含特殊字符的单词以及 R 中的 url
【发布时间】:2014-04-06 02:59:52
【问题描述】:

我想删除包含除 c#/c++ 之外的特殊字符的单词。我也喜欢删除句子中的 url。

例如,我的输入是:

x <- "Google in the la#d of What c#  chell//oo grr+m my Website is: c++ http://www.url.com/bye"

我正在做的是

gsub("http://(\\S+)|\\s*[\\^w\\s]\\s*[^c#c++\\s]","",x)

我的预期输出是

"Google in the of What c#  my Website c++"

但我得到了

"Google in the la#d of What c#  chell//oo grr+m my Webte i c++ "

【问题讨论】:

    标签: regex string r gsub


    【解决方案1】:

    这个怎么样?它似乎可以解决问题。首先用strsplit 拆分字符串似乎更容易一些。下面的一个示例使用grep,另一个示例使用gsub。它们各自使用不同的正则表达式。此外,grep 的参数有时非常很有用。

    > newX <-unlist(strsplit(x, "\\s"))
    

    grep:

    > newX2 <- grep("((^[a-z]{2,3}$)|[A-Z]{1})|(c#|(\\+{2}))", newX, value = TRUE)
    > paste(newX2, collapse = " ")
    [1] "Google in the of What c# my Website c++"
    

    gsub。这实际上要容易得多......他们的关键思想是确定标点符号在字符中出现的模式。

    > paste(gsub("[a-z]{2,3}(:|#)|(\\+|//)[a-z{1}]", "", newX), collapse = " ")
    [1] "Google in the of What c#  my Website c++"
    

    【讨论】:

    • 这种类型的解决方案比完成整个工作的正则表达式更容易理解。
    • 它很棒...简单而优雅...我很乐意接受您的回答,但很抱歉我已经选择了一个...
    • 我同意。 grep 的参数在大多数情况下也很有用。
    • @tanay 您可以更改您的选择。您应该选择最能回答您的问题的答案。
    • @tanay 我不担心。做你想做的。我真的很喜欢一个好的正则表达式挑战。:)
    【解决方案2】:

    这是一个单一的正则表达式,虽然非常丑陋,但可以完成工作:

    gsub('(?:^|(?<=\\s))(?:(c\\+\\+|c#)|http://[^\\s]*|[^\\s]*[#/:+]+[^\\s]*)(?:\\s|$)', '\\1', x, perl=TRUE)
    ## [1] "Google in the of What c# my Website c++"
    

    这使用表达式[#/:+] 作为“特殊字符”的匹配项,而不是c#c++ 中的“特殊字符”。

    分解:

    首先,必须有一个空格(但实际上不匹配),或者它必须是匹配开始的文本的开头:(?:^|(?&lt;=\\s))。选择显示为带有(?:) 的非捕获组。这很重要,因为我们希望在表达式中捕获c#c++(稍后)。

    接下来,给出了三个选项的选择,| 作为分隔符:(?:(c\\+\\+|c#)|http://[^\\s]*|[^\\s]*[#/:+]+[^\\s]*)。这个选择是另一个非捕获组。

    前两个选择(实际上是一个选择,但在正则表达式中匹配有两种可能性)匹配c++c# 并使用(c\\+\\+|c#) 捕获值。否则,URL 表示可能会与http://[^\\s]* 匹配,或者带有特殊字符的单词会与[^\\s]*[#/:+]+[^\\s]* 匹配。不捕获带有特殊字符的 URL 或单词。

    最后,必须有一个空格或者它必须是字符串的结尾,由 (?:\s|$) 指定的最后一个非捕获组:(?:\\s|$)

    然后整个表达式被第一次捕获替换,可能为空。如果不为空,则捕获将包含字符串c#c++

    您确实需要perl=TRUE 才能使此表达式有效。

    【讨论】:

    • 请注意,如果带有/ 的单词被拒绝,那么匹配 URL 是多余的。我把它留在里面是因为它明确地出现在问题中,但“特殊字符”的定义不是。
    • 现在如果我需要删除所有包含特殊字符的单词,例如 $、% 和等...例如 wha$t..
    • @tanay 将这些字符添加到表达式[^\\s]*[#/:+]+[^\\s]* 中的正则表达式字符类[#/:+]。事实上,它只匹配这四个字符。所以你想要:[^\\s]*[#/:+$%&amp;]+[^\\s]*
    • 但是如果有像 in\\\n 这样的词,那么如果我在类 [#/:+] 中放入 '\' 就会产生错误
    • @tanay 反斜杠在任何地方都是邪恶的,因为有不同程度的解释。要将值与 R 中的反斜杠匹配,请将其中四个放在字符类中!例如,[#/:+$%&amp;\\\\]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多