【问题标题】:Are there raw strings in R for regular expressions?R中是否有用于正则表达式的原始字符串?
【发布时间】:2016-02-28 22:05:22
【问题描述】:

在 Python 中,您可以使用原始字符串:

import re
re.sub(r"\\", ":", "back\\slash")  # r"\\" instead of "\\\\"

这是否也存在于 R 中?例如,下面是一个在 R 中没有原始字符串的等效代码 sn-p:

library(stringr)
str_replace("back\\slash", "\\\\", ":")

我希望能够做到这一点:

str_replace("back\\slash", raw("\\"), ":")

这个功能是否已经存在,或者我应该只实现我自己的功能raw()

【问题讨论】:

  • 我觉得你可以用[]
  • 用于正则表达式:sub("\\", ":", "back\\slash", fixed = TRUE)
  • sub("[\\]", ":","back\\slash")sub("\\", ":","back\\slash", fixed = TRUE)都有效
  • 我认为一个更好的例子是如何将"\\w+\\s+\\d+"写成raw("\w+\s+\d+")。只是一个反斜杠是“模棱两可的”。
  • 这被称为“倾斜牙签综合症”:en.wikipedia.org/wiki/Leaning_toothpick_syndrome

标签: regex r


【解决方案1】:

从 R 4.0.0 开始,此功能可用。

原始字符常量也可以使用类似于 C++ 中使用的那个:r"(...)"... 任意字符 序列,但它不能包含结束序列 )"。分隔符对 []{} [c] 也可以是 用过的。为了增加灵活性,可以放置许多破折号 在开始引号和开始分隔符之间,只要相同 结束分隔符和结束引号之间出现的破折号数。

来自?Quotes中的示例:

r"{(\1\2)}"
## [1] "(\\1\\2)"

(注意,双反斜杠是 R 对反斜杠的打印表示:此对象上的cat() 将打印(\1\2)

【讨论】:

  • 这是一个好消息,它正在认真讨论或正在开发中,并将在可预见的将来得到解决。感谢您的回复。也许这问得太多了,但我发现 Python 中另一个对其一致性和实用性有用的“伟大的简化器”特性是文档字符串对象语法,即使用平衡的三引号(“””文档字符串双引号语法“””或''' docstring 单引号语法 ''') 用于多行 cmets 和内部文档字符串。我必须向 R 核心语言开发人员提出要求。
  • r-devel@r-project.org 邮件列表是提出此类请求的正确位置。 (注意,R 目前没有这样的“内部文档字符串”约定——尽管我认为 roxygen(2) 系统比 Python 文档字符串功能更全面......)
  • 遗憾的是,在将 SQL 中的正则表达式传递给 Athena 时,这并不能解决问题。
  • 按照 OP 的示例,应该这样做:str_replace("back\\slash", r"(\\)", ":")
【解决方案2】:

对于您的示例,R stringi 包在这里很有帮助。

library(stringr)
library(stringi)
str_replace("back\\slash", stri_escape_unicode("\\"), ":")

由于这是非常冗长的定义 r <- stri_escape_unicode 将接近您想要的功能 (r("\\"))。

stringi 包还具有反向转义 stri_unescape_unicode 的功能,这在用户输入自动转义的闪亮应用中非常有用。

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 2016-04-07
    • 2015-12-18
    • 2022-01-06
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多