【问题标题】:R: extract list of matching parts of a string via regexR:通过正则表达式提取字符串匹配部分的列表
【发布时间】:2015-01-13 12:25:00
【问题描述】:

假设我需要从一个字符串中提取不同的部分作为列表,例如我想将字符串"aaa12xxx"分成三个部分。

一种可能性是进行三个gsub 调用:

parts = c()
parts[1] = gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\1', "aaa12xxx")
parts[2] = gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")
parts[3] = gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\3', "aaa12xxx")

当然,这似乎很浪费(即使它在for 循环内)。难道没有一个函数可以简单地从正则表达式和测试字符串中返回部分列表吗?

【问题讨论】:

    标签: regex r string substring string-matching


    【解决方案1】:

    只需将输入字符串通过strsplit 拆分并得到你想要的部分..

    > x <- "aaa12xxx"
    > strsplit(x,"(?<=[[:alpha:]])(?=\\d)|(?<=\\d)(?=[[:alpha:]])", perl=TRUE)
    [[1]]
    [1] "aaa" "12"  "xxx"
    

    通过指定索引号获取零件..

    > m <- unlist(strsplit(x,"(?<=[[:alpha:]])(?=\\d)|(?<=\\d)(?=[[:alpha:]])", perl=TRUE))
    > m[1]
    [1] "aaa"
    > m[2]
    [1] "12"
    > m[3]
    [1] "xxx"
    
    • (?&lt;=[[:alpha:]])(?=\\d) 匹配所有以字母开头后跟数字的边界。

    • |

    • (?&lt;=\\d)(?=[[:alpha:]]) 匹配前面有数字,后面有字母的所有边界。

    • 根据匹配的边界分割您的输入将为您提供所需的输出。

    【讨论】:

    • 但 perl 选项仅与您的正则表达式格式相关,我的意思是,这不是强制性的,对吧?
    • @AvinashRaj,我建议您 unlist(m) 然后将其索引为正常的原子向量,而不是每次都使用双索引。
    • @DavidArenburg:你为什么认为这是强制性的?这就是他决定的正则表达式格式。我认为我可以使用另一种格式来达到相同的结果
    • @asb,你可以决定你想要的任何正则表达式。就像几乎任何问题都可以使用不同的方法来解决。我的意思是这个解决方案使用基本 R 操作,使用perl = TRUE 作为gsub 中的参数是没有问题的。此外,如果没有perl = TRUE,您将无法进行后视。
    【解决方案2】:
    (\\d+)|([a-zA-Z]+)
    

    ([[:alpha:]]+)|([0-9]+)
    

    您可以从library(stringr) 获取捕获。使用str_match_all()。查看演示。

    https://regex101.com/r/fA6wE2/8

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多