regex 如果模式在gsub中匹配,则仅返回值

xfyts7mz  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(89)

我有一个字符串,其中包含以下形式的账单:

bills <- c("2940 Green apples 250g", "5435 Bananas 0,5kg", "3425 Milk")

我想提取产品的重量,我这样做了:

gsub(".*\\s(\\d*,*\\d+)\\s*(g|kg)$", "\\1", bills)
"250"       "0,5"       "3425 Milk"

这种方法是有效的,因为它正确地返回了前两个条目的250和0,5,但是为什么它返回了整个第三个条目“3425 Milk”?我想通过使用"\\1"我会告诉gsub提取第一个匹配组,这里是(\\d*,*\\d+)。因此,我希望最后一个条目是NA或空字符串。因此这是我的预期输出:

expected <- c("250", "0,5", NA) # OR
expected <- c("250", "0,5", "")
8ehkhllq

8ehkhllq1#

您可以添加更改以捕获所有内容。
如果你的替换字符串没有引入新的符号(只是捕获的组的重组,例如\\1\\1\\3\\2),这将导致用空字符串替换输入字符串:

gsub(".*\\s(\\d*,*\\d+)\\s*(g|kg)$|.*", "\\1", bills)
# [1] "250"  "0,5" ""

另外,我会将,*更改为,?,因为我不相信您的输入将是有效的,如果它包含类似1,,,5g的内容

wd2eg0qa

wd2eg0qa2#

使用 stringr,我会保留“g”和“kg”,因为当删除这些数字时,它们处于不同的刻度。

library(stringr)

bills <- c("2940 Green apples 250g", "5435 Bananas 0,5kg", "3425 Milk")

str_extract(bills, "\\d+(\\,\\d+)?(k?g)")
# [1] "250g"  "0,5kg" NA

相关问题