R中是否有正则表达式的原始字符串?

时间:2016-02-28 22:05:23

标签: regex r

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

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

这也存在于 R 中吗?例如,以下是 R

中没有原始字符串的等效代码段
library(stringr)
str_replace("back\\slash", "\\\\", ":")

我希望能够做到这一点:

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

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

3 个答案:

答案 0 :(得分:19)

自R 4.0.0起可用。

还可以使用类似于以下语法的原始字符常量 C ++中使用的一个:r"(...)"...任意字符 序列,但它不得包含结束序列 )"。分隔符对[]{} [c] an也是 用过的。为了提高灵活性,可以放置多个破折号 开头引用和开头分隔符之间的值,只要相同 在分隔符和引号之间出现短划线。

来自?Quotes中的示例:

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

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

答案 1 :(得分:2)

不完全按照您想要的方式(即不是原始字符串的语言范围规范),并且没有明确记录,但您可以实现我的解释为更广泛的目标(进行字符串替换)通过设置搜索模式的类,在name = input(': ') password = input(': ') age = input(': ') hello = [name, password, age] with open('db.csv', 'a') as testfile: csv.writer(testfile).writerow(hello) 函数中不与笨拙的目标模式规范作斗争。

stringr

不幸的是,s <- "\\" class(s) <- "fixed" str_replace("back\\slash", s, ":") 意味着“动态设置对象的类属性”以外的其他内容,因此您可能需要定义

setClass()

str_replace_fixed <- function(string, pattern, replacement) { class(pattern) <- "fixed" return(str_replace(string,pattern,replacement)) } 已经有str_split_fixed()个;您可以请求将stringr添加到包中...(如果我发布了issue on the stringr Github repo我可能会首先要求明确记录此功能,然后再实施str_replace_fixed。 ..)

正如评论中所指出的,大多数base-R字符串操作函数(str_split_fixedsubgsubgrep)已经有{{ 1}}参数......

答案 2 :(得分:1)

对于您的示例,R <4.0.0替代方法是使用自动转义特殊字符的函数的另一种方法。这里的stringi包很有帮助。

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

由于这非常冗长,因此定义r <- stri_escape_unicode会接近您所需的功能(r("\\"))。

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