【问题标题】:R regex get the text between single quotesR 正则表达式获取单引号之间的文本
【发布时间】:2015-08-02 23:32:37
【问题描述】:

我有类似的文字

la<-c("case when ANTIG_CLIENTE <= 4 then '01: ANTIG_CLIENTE <= 4' when ANTIG_CLIENTE <= 8 then '02: ANTIG_CLIENTE <= 8' 
else '99: Error' end ")

我想将单引号之间的文本提取为列表:

"01: ANTIG_CLIENTE <= 4","02: ANTIG_CLIENTE <= 8","99: Error"

我尝试了两种方法都没有成功

> sub('[^\]+\"([^\']+).*', '\\1', la)
Error: '\]' is an unrecognized escape in character string starting "'[^\]"
> regmatches(x, gregexpr('"[^']*"', la))[[1]]
Error: unexpected ']' in "regmatches(x, gregexpr('"[^']"

如何获取单引号之间的文字?

【问题讨论】:

    标签: regex r


    【解决方案1】:

    这应该得到你想要的。唯一的假设是你想要的所有单引号之间的字符串都包含一个冒号(否则,我们应该如何区分'01: ANTIG_CLIENTE &lt;= 4'' when ANTIG_CLIENTE &lt;= 8 then ',两者都在单引号之间?):

    > regmatches(la,gregexpr("'[^']*:[^']*'",la))
    [[1]]
    [1] "'01: ANTIG_CLIENTE <= 4'" "'02: ANTIG_CLIENTE <= 8'" "'99: Error'"   
    

    基本上,我们试图返回单引号形式的所有表达式(因此gregexpr而不是regexpr),除了单引号、冒号、单引号之外的东西、单引号。

    如果你想消除返回的单引号,你将需要前瞻和后瞻,这需要告诉 R 将你的正则表达式解释为 perl:

    > regmatches(la,gregexpr("(?<=')[^']*:[^']*(?=')",la,perl=T))
    [[1]]
    [1] "01: ANTIG_CLIENTE <= 4" "02: ANTIG_CLIENTE <= 8" "99: Error" 
    

    【讨论】:

    • 感谢您的回答。字符串从不以单引号开头。我收到一个错误:> x&lt;-unlist(strsplit(la,split="'")) Error in strsplit(la, split = "'") : non-character argument
    • @OscarBenitez 查看更新。修订是一个更好的答案。
    • @OscarBenitez inre:你的错误,我唯一能想到的可能是class(la)!="character"
    • 您可以通过使用 perl 前瞻和后视来删除引号本身 - regmatches(la,gregexpr("(?&lt;=')[0-9].+?(?=')",la,perl=TRUE))
    • @thelatemail 是的,正要编辑它。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2020-03-14
    • 2013-04-12
    • 2011-06-22
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多