检查当前单词之前是否有多个单词

时间:2014-10-23 23:51:01

标签: regex r string

我有以下风格的字符串:

Random Inc
A Non-Random Inc

我想从所有字符串中删除单词Inc,因为前面有超过1个字。以上两个例子的结果是:

Random Inc
A Non-Random

为此插入gsub的正确的正则表达式是什么?特别是,如何在正则表达式中指定完整的单词?我以为它会是\w,但这是一个单词字符似乎不正确。

3 个答案:

答案 0 :(得分:3)

\w匹配单词字符,但在这种情况下,您似乎需要考虑连字符并使用quantifier

x <- c('Random Inc', 'A Non-Random Inc', 'Another Inc', 'A Random other Inc')
sub('[\\w-]+ [\\w-]+\\K *Inc', '', x, perl=TRUE)
# [1] "Random Inc"     "A Non-Random"   "Another Inc"    "A Random other"

首先我们匹配单词字符的任何字符,连字符“一个或多个”次,后跟空格后跟单词字符,连字符“一次或多次”。 \K转义序列会重置报告的匹配的起始点,并且不再包含任何以前消费的字符。然后我们匹配空白“零或更多”时间后跟单词Inc。因为我们使用\K,我们使用空替换,因为\K充当零宽度断言。

答案 1 :(得分:1)

你可以使用这样的正则表达式:

([-\w]+\s+[-\w]+)\s+Inc

<强> Working demo

enter image description here

答案 2 :(得分:0)

我认为你的意思是一个或多个非空格字符作为完整的单词。如果是,那么您可以使用\S+

> x <- c('Random Inc', 'A Non-Random Inc', 'Another Inc', 'A Random other Inc')
> sub("^\\S+(?:\\s+\\S+)?$(*SKIP)(*F)|\\s+Inc\\b", "", x, perl=T)
[1] "Random Inc"     "A Non-Random"   "Another Inc"    "A Random other"
  • ^\\S+(?:\\s+\\S+)?$匹配恰好有一两个单词的行。
  • (*SKIP)(*F)导致匹配失败。
  • |或者(即,只考虑字符串的剩余部分)
  • \\s+Inc\\b Matche Inc以及之前的一个或多个空格字符。