我有一个像下面这样的向量:
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)