【问题标题】:Using R to parse and return text in parenthesis使用R解析并返回括号中的文本
【发布时间】:2012-09-10 21:28:13
【问题描述】:

假设我有一个字符串:

x <- "This is a string (Yay, string!)" 

我想解析字符串并返回“Yay, string!”

我该怎么做?

我尝试了一堆 grep/grepl/gsub/sub/etc,但找不到正确的正则表达式或参数组合。叹。我需要学习正则表达式技能。

【问题讨论】:

  • 绝对是骗子,但答案似乎不同。
  • gsubfn 包中的 strapplyc 处理这样的问题。以下代码中的正则表达式匹配 ( 后跟任意数量的不是 ) 的字符并返回括号内的部分:library(gsubfn); strapplyc(x, "\\(([^)]*)", simplify = TRUE) 默认情况下它使用非常快的 tcl 正则表达式,例如查看?strapplyc 中的示例,以了解在几秒钟内解析詹姆斯·乔伊斯的《尤利西斯》整个文本的示例。关于学习正则表达式,gsubfn主页gsubfn.googlecode.com有正则表达式资源链接。

标签: r


【解决方案1】:

这里有两种方法:

一:找到你想要的字符串,并用找到的位替换整个字符串。 (称为反向引用)

gsub(".*\\((.*)\\).*", "\\1", x)
[1] "Yay, string!"

之所以有效,是因为:

  • 您使用反向引用 \\1 来引用括号中的匹配字符串 (.*)
  • 由于您要排除实际字符串中的括号,您需要使用\\(\\) 对它们进行转义。

二:用空字符串替换所有不需要的位:

gsub(".*\\(|\\).*", "", x)
[1] "Yay, string!"

这是因为| 的作用类似于OR

【讨论】:

  • 是否有一些关于\\1 用法的文档?我在 ?grep 的底部读到了它,但不明白。
  • @BrandonBertelsen 我稍微扩展了答案,但总的来说,我的建议是从 R 文档以外的任何地方学习正则表达式。例如,这里是tutorial on backreferences
  • @BrandonBertelsen 我还添加了相反的方法,即用空字符串替换您不想要的位。
  • 感谢此处的额外关注和教程链接。
【解决方案2】:

此外,如果您的某些字符串可能包含多个带括号的子字符串,您想要提取所有这些子字符串,请使用正则表达式电动工具 gregexpr()regmatches()

x <- "This is (a) string (Yay, string!)" 
pat <- "(?<=\\()([^()]*)(?=\\))"
regmatches(x, gregexpr(pat, x, perl=TRUE))
# [[1]]
# [1] "a"            "Yay, string!"

【讨论】:

  • 就这样,我现在看到我的答案与上面 Tyler Rinker 刚才提到的答案完全相同!
  • 这是qdapbracketXbracketXtract 函数的基础。我问了一个类似的问题,并在此处提供了更多详细信息:stackoverflow.com/questions/8621066/…
  • 我看到了这个问题,但对于我对正则表达式的有限理解而言,它太复杂了。
  • 你的意思是你不会说"(?&lt;=\\()([^()]*)(?=\\))"? ;-)
【解决方案3】:

qdap version 1.1.0 可以这样做:

library(qdap)
x <- "This is a string (Yay, string!)" 

bracketX(x)
bracketXtract(x)

产量:

> bracketX(x)
[1] "This is a string"
> bracketXtract(x)
[1] "Yay, string!"

虽然如果你没有做太多这些事情,那么获得 qdap 可能有点矫枉过正。

编辑:以 Josh 为例...

> x <- "This is (a) string (Yay, string!)" 
> bracketX(x)
[1] "This is string"
> bracketXtract(x)
[1] "a"            "Yay, string!"

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2015-10-12
    相关资源
    最近更新 更多