通过正则表达式提取字符串中匹配部分的列表

3
假设我需要将一个字符串分成列表中的不同部分,例如我想把字符串"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循环内)。有没有一种函数可以从正则表达式和测试字符串中简单地返回部分列表?
2个回答

4

只需通过 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"
  • (?<=[[:alpha:]])匹配后面跟着数字,前面是字母的边界。

  • | 或者

  • (?<=\\d)(?=[[:alpha:]])匹配后面是字母,前面是数字的边界。

  • 根据匹配到的边界分割您的输入,即可获得所需的输出。


但是Perl选项仅与您的正则表达式格式相关,我的意思是,它不是强制性的,对吗? - fstab
2
@AvinashRaj,我建议您将 unlist(m) 然后像普通原子向量一样对其进行索引,而不是每次都使用双重索引。 - David Arenburg
@DavidArenburg:你为什么认为这是强制性的?这只是他决定的正则表达式格式。我可以使用另一种格式来达到相同的结果,我想。 - fstab
1
@asb,你可以决定任何你想要的正则表达式。几乎任何问题都可以使用不同的方法来解决。我意思是这个解决方案使用了基本的R操作,并且在gsub内部使用perl = TRUE作为一个参数是没有问题的。此外,如果没有perl = TRUE,就不能进行向后查找。 - David Arenburg

3
(\\d+)|([a-zA-Z]+)

或者

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

您可以使用library(stringr)中的str_match_all()函数来获取匹配结果。请参见示例。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接