如何将没有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 ')

感谢您的帮助。

sibi333 回答:如何将没有am或pm的所有数字替换为标准字符串?

我们可以使用带有正则表达式的正则表达式来检查上午或下午。我使用了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))会向前看,并打折扣在下一个空格后有上午或下午的任何比赛。这对于打折第二个数字至关重要。

,

您可以使用前瞻?!运算符来匹配上午和下午。将perl设置为true是很重要的,否则,该表达式无效。

sub('#?[0-9]+(\\-[0-9]+)?[a-z]*(?!am|pm)','none',x,perl = TRUE)
本文链接:https://www.f2er.com/2965399.html

大家都在问