【问题标题】:How to remove words from a string in specific pattern and keep the first number如何以特定模式从字符串中删除单词并保留第一个数字
【发布时间】:2020-11-13 03:07:59
【问题描述】:

我有一堆格式为d.d$ word1 word2 word3 的字符串。字 2 和 3 可以是字符串,也可以不是。例如,我有这些字符串:

1.0% SELLING
3.2% AND 1.0% AND 1.2%
1.0% SOLD PRICE
1.2% PURCHASE PRICE FINAL
2.5% AND 1.0%
1.0% SELLING 2.0% people

我愿意做的是只对字符串1、3、4我只保留1.0% 1.0% 1.2% 我试图做的是:

gsub("(\\d\\.\\d%) \\w+ ((?:\\w+)?)+", "\\1",x)

而我使用上述模式的原因是:

(\\d\\.\\d%) ....> capturing the number part
\\w+ .....> first word
((?:\\w+)?)+  .....> second and other words (optional and in no-capturing group)

(由于某种原因,\s 在某些情况下对我不起作用,它被捕获为 s!所以我在单词之间使用空格)

预期结果应如下所示:

1.0%
3.2% AND 1.0% AND 1.2%
1.0%
1.2%
2.5% AND 1.0%
1.0% SELLING 2.0% people

代码应该只更改遵循以下模式的字符串:d.d% (rest of the string are only words and not a number)(这就是为什么 1.0% SELLING 2.0% 的人没有被更改)

但是,此代码仅适用于 2 个单词,而对于 1 或 3 个单词则不起作用。请告诉我如何解决这个问题?

【问题讨论】:

  • @RonakShah 我添加了结果

标签: r regex gsub


【解决方案1】:

你可以使用

sub('^(\\d+\\.\\d+%)(?:\\s+\\w+)*$', '\\1', x, perl=TRUE)
stringr::str_replace(x, '^(\\d+\\.\\d+%)(?:\\s+\\w+)*$', '\\1')

请参阅regex demo。详情:

  • ^ - 字符串开头
  • (\d+\.\d+%) - 第 1 组 (\1):一位或多位数字、.、一位或多位数字和一个 % 符号
  • (?:\s+\w+)* - 零次或多次重复一个或多个空白字符,然后是一个或多个单词字符
  • $ - 字符串结束。

R demo

x <- c("1.0% SELLING","3.2% AND 1.0% AND 1.2%","1.0% SOLD PRICE","1.2% PURCHASE PRICE FINAL","2.5% AND 1.0%","1.0% SELLING 2.0% people")
sub('^(\\d+\\.\\d+%)(?:\\s+\\w+)*$', '\\1', x, perl=TRUE)
library(stringr)
stringr::str_replace(x, '^(\\d+\\.\\d+%)(?:\\s+\\w+)*$', '\\1')

两个输出

[1] "1.0%"                     "3.2% AND 1.0% AND 1.2%"  
[3] "1.0%"                     "1.2%"                    
[5] "2.5% AND 1.0%"            "1.0% SELLING 2.0% people"

【讨论】:

    【解决方案2】:

    您可以从字符串中提取所有数字并仅替换其中只有一位数字的数字。

    tmp <- stringr::str_extract_all(x, '\\d+\\.\\d+%')
    x[lengths(tmp) == 1] <- unlist(tmp[lengths(tmp) == 1])
    x
    
    #[1] "1.0%"      "3.2% AND 1.0% AND 1.2%"   "1.0%"                    
    #[4] "1.2%"      "2.5% AND 1.0%"            "1.0% SELLING 2.0% people"
    

    【讨论】:

    • 我确信这是一个有效的解决方案,但问题是这些字符串中的每一个都在数据帧的一个单元格中,我想在同一个单元格中进行替换。我认为sapply 以单独列表的形式返回它。对吗?
    • 不,替换将发生在同一个单元格中,因为我们在这里使用collapse
    • 对不起,我想这不能回答我的问题。我正在寻找的只是一个改变number.number% word word.... (the rest should be word) 之类的模式的代码。您提供的内容会将"1.0% SELLING 2.0% people" 之类的字符串更改为"1.0% AND 2.0%",我不希望这种情况发生。因为在那种情况下,它会改变其他字符串
    • 那你想把"1.0% SELLING 2.0% people"改成什么?也许您应该更新您的帖子并提供一个更好的示例,因为我的回答给出了您所显示的预期答案。
    • 那么"1.0% SELLING 2.0% people" 根本不应该改变。我希望代码只更改d.d% (rest of string only words) 形式的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2022-01-16
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多