【问题标题】:Gsub to get part matched strings in R regular expression?Gsub 在 R 正则表达式中获取部分匹配的字符串?
【发布时间】:2012-10-19 01:41:19
【问题描述】:
gsub('[a-zA-Z]+([0-9]{5})','\\1','htf84756.iuy')
[1] "84756.iuy"

我要84756,怎么办?

【问题讨论】:

  • 该正则表达式的工作原理与在 gsubfn 包中使用 strapplyc 一样:library(gsubfn); strapplyc('htf84756.iuy', '[a-zA-Z]+([0-9]{5})', simplify = TRUE)。见gsubfn.googlecode.com

标签: regex r


【解决方案1】:

gregexpr()regmatches() 一起使用的优点是只要求您的模式与您实际要提取的位相匹配:

string <- 'htf84756.iuy'
pat <- "(\\d){5}"

regmatches(string, gregexpr(pat, string))[[1]]
# [1] "84756"

(实际上,当提供的字符串可能包含多个匹配pat 的子字符串时,这些函数会更有用。)

【讨论】:

    【解决方案2】:

    试试这个:

    R> gsub('[a-zA-Z]+([0-9]{5}).*','\\1','htf84756.iuy')
    [1] "84756"
    R> 
    

    您需要在“贪婪”正则表达式末尾添加 .* 以在 5 位数字后终止它。

    【讨论】:

    • +1 但也许不是 terminate 它作为 match 字符串的其余部分,所以它不只是被调用留在原地到gsub()
    【解决方案3】:

    根据要添加到您的内容,这也可以工作(就像 Dirk 的回答更好):

    gsub('[a-zA-Z]+([0-9]{5})\\.([a-zA-Z])+','\\1','htf84756.iuy')
    

    如果您只想要数字字符串,这也可能会有所帮助:

    gsub('[^0-9]','','htf84756.iuy')
    

    【讨论】:

    • 注意“.”只匹配一个“.”偶然,如果你真的想指定一个实际的时期,你需要逃避它。您似乎也不需要将第一个正则表达式的最后一部分设为标记的子表达式,因为您没有从中获取任何内容。而在你的第二个中,你不需要用 \\1 替换,因为你的表达式中没有任何东西是子表达式,所以它和用 "" 替换是一样的。
    • @Dason 感谢您的建议。我在编辑中进行了更改。
    【解决方案4】:

    使用stringr,您可以使用str_extract

    library(stringr)
    str_extract("htf84756.iuy", "[0-9]+")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 2017-11-19
      • 2014-12-30
      • 1970-01-01
      • 2016-01-04
      • 2015-10-25
      • 1970-01-01
      • 2015-11-30
      相关资源
      最近更新 更多