如何使用正则表达式按顺序提取字符串中包含的数字
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 组:零个或多个数字。
我有一个如下所示的数据框:
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 组:零个或多个数字。