【问题标题】:Replace special characters (dash)替换特殊字符(破折号)
【发布时间】:2016-03-01 16:15:22
【问题描述】:

我试图用gsub 替换我认为的标准破折号。我正在测试的代码是:

gsub("-", "ABC", "reported – estimate")

不过,这无济于事。我将破折号复制并粘贴到http://unicodelookup.com/#–/1 中,它似乎是一个破折号。该站点为破折号提供十六进制、十进制等代码,我一直在尝试替换破折号,但没有运气。有什么建议吗?

(作为奖励,如果您能告诉我是否有识别特殊字符的功能会有所帮助)。

我不确定 SO 的代码格式是否会改变破折号格式,所以这里是我使用的破折号 (–)。

【问题讨论】:

    标签: regex r


    【解决方案1】:

    您可以通过在正则表达式模式中指定它来替换短划线。

    gsub("–", "ABC", "reported – estimate")
    

    您可以匹配所有连字符、en- 和 em-dashes

    gsub("[-–—]", "ABC", "reported – estimate — more - text")
    

    IDEONE demo

    要检查字符串中是否有非ASCII字符,请使用

    > s = "plus ça change, plus c'est la même chose"
    > gsub("[[:ascii:]]+", "", s, perl=T)
    [1] "çê"
    

    this IDEONE demo

    您将得到一个空结果(如果字符串仅由“单词”字符和空格组成),或者 - 如此处 - 一些“特殊”字符。

    【讨论】:

    • 这很棒。也许我没有使用“特殊字符”的正确术语。我的意思是不是标准 UTF-8 的字符。例如,ô -- 这些是我发现使用 readr::write_csv() 导出时看起来很奇怪的字符。是否可以更改您提供的 gsub 以将“ô”识别为“特殊字符”。
    • 您可以将它与正则表达式一起使用以匹配所有 ascii:gsub("[[:ascii:]]+", "", s)。这将从字符串中删除所有 ascii,并在结果中保留所有 Unicode 字符。
    • 您只需将perl=T 与上述正则表达式模式一起使用,因为这是一个PCRE 构造。
    【解决方案2】:

    对于特殊字符替换,你可以做一个否定的补充。

    gsub('[^\\w]*', 'ABC', 'reported - estimate', perl = True) 会将所有特殊字符替换为 ABC。 [^\w] 是一个模式,它表示任何非正常字符。

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多