r语言 - 如何将所有没有 am 或 pm 的数字替换为标准字符串?



我有一个像下面这样的向量:

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

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

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

但这行不通。 我的预期输出如下所示:

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

任何帮助,不胜感激。

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

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的比赛。这对于打折第二个数字至关重要。

您可以使用前瞻?!运算符来不匹配 am 和 pm。将 perl 设置为 true 很重要,否则表达式无效。

sub('#?[0-9]+(\-[0-9]+)?[a-z]*(?!am|pm)' , 'none', x, perl = TRUE)

最新更新