首页 > 解决方案 > 如何将没有 am 或 pm 的所有数字替换为标准字符串?

问题描述

我有一个如下所示的向量:

x <- c('3b  and to 10 am ','1c  and to 12 pm','#01-93  and to 10 am ')

我需要将所有没有字符串 am 或 pm 的数字替换为 "none" 。所以我尝试使用

sub('.*-([0-9]+).*' ,'none',x)

但这不起作用。我的预期输出如下:

x <- c('none  and to 10 am ','none and to 12 pm','none  and to 10 am ')

任何帮助表示赞赏。

标签: rstr-replacegsubstringr

解决方案


我们可以使用带有前瞻的正则表达式来检查上午或下午。我使用了 stringr 包,但它也应该与基本函数一起使用。

library(stringr)

str_replace(x, "(\\S*[0-9]+\\S*)(?!\\S*\\s(am|pm))", "none")

# > "none  and to 10 am " "none  and to 12 pm"  "none  and to 10 am "

如果每个元素中可能有多个数字要替换,请使用str_replace_all()代替str_replace()

如果你想摆脱多余的空间,我建议使用stringr::str_squish().


正则表达式分解

  • \\S*查找零个或多个非空白字符。

  • [0-9]匹配数字 0 - 9。

  • 所以(\\S*[0-9]+\\S*)寻找一个两边都有零个或多个非空白字符的数字。这匹配您示例中的所有情况,但如果此假设不正确,您可能必须更具体。

  • \\s匹配一个空白字符

  • (am|pm)匹配上午或下午

  • (?!x)向前看并打折任何后跟 x 的匹配项

  • 因此(?!\\S*\\s(am|pm)),向前看并折扣任何在下一个空格之后具有 am 或 pm 的匹配项。这对于打折第二个数字至关重要。


推荐阅读