如何使用正则表达式按顺序提取字符串中包含的数字

How to extract numbers included in a string in order using regex

我有一个如下所示的数据框:

df <- data.frame(col = c("3.2% 1ST 0000 AND 1.1% BALANCE", "3.3% 1ST 0000 AND 1.2% BALANCE AND 00 BONUS FULL PRICE ONLY", 
                         "00", "3.3% 1ST 0000 AND 1.2% BALANCE", "3.3% 1ST 0000 AND 1.2% BALANCE", 
                         "3.2% 1ST 0000 1.1% BALANCE","2.1% 1ST 0000 AND 1.2% BALANCE PLUS 00"))

                                                                col
1                                 3.2% 1ST 0000 AND 1.1% BALANCE
2 3.3% 1ST 0000 AND 1.2% BALANCE AND 00 BONUS FULL PRICE ONLY
3                                                             00
4                                 3.3% 1ST 0000 AND 1.2% BALANCE
5                                 3.3% 1ST 0000 AND 1.2% BALANCE
6                                     3.2% 1ST 0000 1.1% BALANCE
7                      2.1% 1ST 0000 AND 1.2% BALANCE PLUS 00 

我想做的是将这些字符串中的数字分开,并将它们放在新数据框的不同列中。正如@Ronak Shah 在这里推荐的那样:

我用了这个方法,效果很好:

library(tidyverse)

    a<-df %>%
      extract(col, c('First', 'cut-off', 'Second'), 
              '(\d+.*?)% 1ST\s*\$(\d+).*?(\d+.*?)%.*?', remove = FALSE) %>%
      mutate(Bonus = str_extract(col, '\d+(?=\sBONUS)')) 

然而,我才意识到,有时由于某种原因,评论中没有提到 BONUS 这个词,而这个数字实际上是 BONUS。例如在这个字符串 2.1% 1ST 0000 AND 1.2% BALANCE PLUS 00 中,第四个数字是 BONUS 但它后面没有跟单词“BONUS”,因此无法捕获该数字。 我想知道是否有什么办法可以解决这个问题?有没有办法提取字符串的第四个数字?似乎在大多数情况下,这个 BONUS 号码是我字符串的第四个号码。

你可以使用

^(\d[\d.]*)%\s*1ST\s*$(\d+)\D*(\d[\d.]*)%\D*(\d*)

参见regex demo

在 R 中,使用

a <- df %>%
  extract(col, c('First', 'cut-off', 'Second', 'Bonus'), 
    '^(\d[\d.]*)%\s*1ST\s*\$(\d+)\D*(\d[\d.]*)%\D*(\d*)', remove = FALSE)

详情

  • ^ - 字符串开头
  • (\d[\d.]*) - 第 1 组:一个数字,然后是零个或多个 digits/dots
  • % - 一个 % 字符
  • \s* - 0+ 个空格
  • 1ST - 一个字符串
  • \s* - 0+ 个空格
  • $ - 一个 $ 字符
  • (\d+) - 第 2 组:一个或多个数字
  • \D* - 0+ 个非数字
  • (\d[\d.]*) - 第 3 组:一个数字,然后是零个或多个 digits/dots
  • %\D* - % 和 0+ 个非数字
  • (\d*) - 第 4 组:零个或多个数字。