【问题标题】:Extract only the characters that are between opening and ending parantheses in the start and end of a string in R仅提取 R 中字符串开头和结尾的左括号和结尾括号之间的字符
【发布时间】:2018-07-11 00:20:29
【问题描述】:

我有很多字符串都具有以下格式:

mystrings <- c(
  "(ABFUHIASH)THISISAVERYLONGSTRINGWITHOUTANYSPACES(ENDING)",
  "(SECONDSTR)YETANOTHERBORINGSTRINGWITHOUTSPACES(RANDOMENDING)", 
  "(JOWERIC)THISPARTSHOULDNOTBEEXTRACTED(GETTHIS)", 
  "(CAPTURETHIS)IOJSDOIOIADSNCXZZCX(IJFAI)"
)

我需要捕获原始mystrings 开头和结尾处括号内的字符串。

因此,变量start 将存储上述每个具有相同索引的字符串的起始字符。结果将是这样的:

start[1]
ABFUHIASH

start[2]
SECONDSTR

start[3]
JOWERIC

start[4]
CAPTURETHIS

同样,mystrings 中每个字符串的结尾将保存到end

end[1]
ENDING

end[2]
RANDOMENDING

end[3]
GETTHIS

end[4]
IJFAI

不应捕获括号本身。

有没有一种方法/功能可以在 R 中快速做到这一点?

我尝试过stringr::wordstringi::stri_extract,但得到的结果很奇怪。

【问题讨论】:

    标签: r regex text-extraction stringr stringi


    【解决方案1】:

    我们可以为此使用stringr 库。例如

    library(stringr)
    mm <- str_match(mystrings, "^\\(([^)]+)\\).*\\(([^)]+)\\)$")
    mm
    

    匹配在捕获组中查找字符串开头和结尾的括号之间的内容,以便轻松提取它们。

    它返回一个字符矩阵,您似乎只需要第二列和第三列。 mm[,2:3]

         [,1]          [,2]          
    [1,] "ABFUHIASH"   "ENDING"      
    [2,] "SECONDSTR"   "RANDOMENDING"
    [3,] "JOWERIC"     "GETTHIS"     
    [4,] "CAPTURETHIS" "IJFAI"
    

    【讨论】:

    • 哇,太棒了,那里有一些真正的正则表达式巫术。我从没想过这项任务需要如此复杂的正则表达式。难怪我的基本正则表达式(例如 \\(*\\) 一直未能捕获开始!
    【解决方案2】:

    这样的事情可能对你有用:

    > regmatches(mystrings,gregexpr("\\(.+?\\)",mystrings))
    [[1]]
    [1] "(ABFUHIASH)" "(ENDING)"   
    
    [[2]]
    [1] "(SECONDSTR)"    "(RANDOMENDING)"
    
    [[3]]
    [1] "(JOWERIC)" "(GETTHIS)"
    
    [[4]]
    [1] "(CAPTURETHIS)" "(IJFAI)"
    

    例如,要提取结尾,您可以:

    lapply(x,tail,1)
    

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 2012-01-28
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多