【问题标题】:Regular expression parsed with grepl replacement用 grepl 替换解析的正则表达式
【发布时间】:2015-07-25 10:52:21
【问题描述】:

目的是解析正则表达式并替换匹配的模式。

考虑这个例子:

data <- c("cat 6kg","cat g250", "cat dog","cat 10 kg") 

我必须找到所有出现的cat 和一个数字[0-9]。为此:

found <- data[grepl("(^cat.[a-z][0-9])|(^cat.[0-9])",data)]
found
[1] "cat 6kg"   "cat g250"  "cat 10 kg"

下一步是将found 的每个元素替换为字符串cat。根据堆栈问题 20219311,我尝试了包 (gsubfn) 中的 gsubsubgsubfn()

gsubfn("((^cat.[a-z][0-9])|(^cat.[0-9]))", "cat",data)
[1] "catkg"   "cat50"   "cat dog" "cat0 kg"

这不是预期的结果:

[#] "cat" "cat" "cat dog" "cat"

我想我错过了一点。我会很感激我能得到的任何帮助。谢谢。

【问题讨论】:

    标签: regex r gsub grepl


    【解决方案1】:

    简单,,,, 只需将字符串cat 分配给匹配元素即可。这会将元素中存在的所有字符替换为cat

    > data <- c("cat 6kg","cat g250", "cat dog","cat 10 kg") 
    > data[grepl("(^cat.[a-z][0-9])|(^cat.[0-9])",data)] <- "cat"
    > data
    [1] "cat"     "cat"     "cat dog" "cat" 
    

    > data <- c("cat 6kg","cat g250", "cat dog","cat 10 kg") 
    > data[grepl("^cat.[a-z]?[0-9]",data)] <- "cat"
    > data
    [1] "cat"     "cat"     "cat dog" "cat" 
    

    【讨论】:

    • 谢谢阿维纳什。只是好奇为什么 gsub 不起作用?此外,如何自动替换任何字符串str(即cat)。我必须使用 paste()...
    • @remi gsubfn 只是将所有匹配的字符替换为cat,因此它会留下不匹配的字符。试试gsub("^cat.[a-z]?[0-9].*", "cat", x)。这将匹配所有剩余的字符,因为我们最后添加了.*
    【解决方案2】:

    你也可以

     sub('\\s*dog(*SKIP)(*F)|(?<=cat).*', '', data, perl=TRUE)
     #[1] "cat"     "cat"     "cat dog" "cat"    
    

    或者

     sub('(cat)\\s*([0-9]|[a-z][0-9]).*$', '\\1', data)
     #[1] "cat"     "cat"     "cat dog" "cat"    
    

    【讨论】:

      【解决方案3】:

      试试这个:

      gsub('(\\w?[0-9].*)','',data)
      #[1] "cat "    "cat "    "cat dog" "cat " 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 2019-01-24
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 2020-11-05
        • 2014-03-29
        相关资源
        最近更新 更多