【问题标题】:R regular expression: isolate parenthesized suffixR正则表达式:隔离带括号的后缀
【发布时间】:2021-04-23 01:51:54
【问题描述】:

我在 R 中使用正则表达式。我试图挑选出字符向量中某些字符串末尾的带括号的内容。我能够在括号内的内容存在时找到它,但我无法在没有括号的输入中排除非括号内的内容。

例子:

> x <- c("DECIMAL", "DECIMAL(14,5)", "RAND(1)")
> gsub("(.*?)(\\(.*\\))", "\\2", x)
[1] "DECIMAL" "(14,5)"  "(1)"

输出中的最后两个元素是正确的,第一个不正确。我想要

c("", "(14,5)", "(1)")

输入可以在括号内容之前包含任何内容,实际上是任何单词或数字字符。

【问题讨论】:

  • regmatches(x, gregexpr("([(].*?[)])", x))
  • @EyaawB。聪明的。返回一个列表,而不是一个向量,但可以很容易地清理。

标签: r regex


【解决方案1】:

你可以使用

sub("^.*?(\\(.*\\))?$", "\\1", x, perl=TRUE)

请参阅regex demo详情

  • ^ - 字符串开头
  • .*? - 除换行符之外的任何零个或多个字符(因为它是 PCRE 正则表达式,请参阅 perl=TRUE)尽可能少
  • (\\(.*\\))? - 可选的第 1 组:(,然后是除换行符以外的任何零个或多个字符,尽可能多,然后是 )
  • $ - 字符串结束。

R demo

x <- c("DECIMAL", "DECIMAL(14,5)", "RAND(1)")
sub("^.*?(\\(.*\\))?$", "\\1", x, perl=TRUE)
## => [1] ""       "(14,5)" "(1)" 

注意perl=TRUE 在这种情况下非常重要,因为正则表达式中的两个部分具有不同贪心的量词。

【讨论】:

  • 我在尝试自己解决时错过了perl=TRUE 部分。这是关键部分!谢谢你的解释。
  • @pauljohn32 是的,TRE 正则表达式真是太疯狂了,您可以在this answer of mine 中阅读更多内容。
【解决方案2】:

我们可以使用str_extractregmatches

library(stringr)
library(tidyr)
replace_na(str_extract(x, "\\([^)]+\\)"), "")
#[1] ""       "(14,5)" "(1)"  

sub/gsub如果模式不匹配,则返回整个字符串

【讨论】:

  • 我相信它有效。我不想仅仅为此目的安装 tidyverse。我尽可能避免它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多