R 编程:使用正则表达式提取字符串(不包括空格)
所以我在这里要做的是提取“Charlie”之前的单词(不包括空格)R 编程:使用正则表达式提取字符串(不包括空格),r,regex,R,Regex,所以我在这里要做的是提取“Charlie”之前的单词(不包括空格) a = 'Charlie is at the pet shop.' b = ' Charlie is at the pet shop.' c = 'Jane saw Charlie at the pet shop.' 到目前为止我所做的尝试: > gsub('(.*?)((\\s)*Charlie).*','\\1',a) [1] "" > gsub('(.*?)((\\s)*Charlie).*','\\1'
a = 'Charlie is at the pet shop.'
b = ' Charlie is at the pet shop.'
c = 'Jane saw Charlie at the pet shop.'
到目前为止我所做的尝试:
> gsub('(.*?)((\\s)*Charlie).*','\\1',a)
[1] ""
> gsub('(.*?)((\\s)*Charlie).*','\\1',b)
[1] " "
> gsub('(.*?)((\\s)*Charlie).*','\\1',c)
[1] "Jane saw "
我想要达到的目标:
[1] ""
[1] ""
[1] "Jane saw "
我可以知道为什么上面的代码不起作用吗?另外,我应该如何修改regex模式,以便实现我想要的功能?使用
sub
看起来并不漂亮,但可以这样做:
> sub(".*?(\\S+(?:\\s+\\S+)*)\\s+Charlie.*|.+", "\\1", x)
[1] "" "" "Jane saw"
详细信息:
-任何字符,尽可能少*?
-第1组((\\S+(?:\\S+\\S+)
):\\1
-1个或多个非空白字符\\S+
-零个或多个1+空格序列,后跟1+非空格字符(?:\\s+\\s+)*
-1+空格\\s+
-子字符串Charlie
-到字符串结尾的任何0+字符*
-或|
-任意1+字符(将字符串归零)+
str_extract
,它看起来会更好:
> library(stringr)
> res <- str_extract(x, "\\S+(?:\\s+\\S+)*(?=\\s+Charlie\\b)")
> res
[1] NA NA "Jane saw"
这里,
-查找第一组0+空格字符,后跟\\s*
-子字符串Charlie
后跟Charlie
-字符串末尾的任何0+字符*
- 使用
sub
看起来并不漂亮,但可以这样做:
> sub(".*?(\\S+(?:\\s+\\S+)*)\\s+Charlie.*|.+", "\\1", x)
[1] "" "" "Jane saw"
详细信息:
-任何字符,尽可能少*?
-第1组((\\S+(?:\\S+\\S+)
):\\1
-1个或多个非空白字符\\S+
-零个或多个1+空格序列,后跟1+非空格字符(?:\\s+\\s+)*
-1+空格\\s+
-子字符串Charlie
-到字符串结尾的任何0+字符*
-或|
-任意1+字符(将字符串归零)+
str_extract
,它看起来会更好:
> library(stringr)
> res <- str_extract(x, "\\S+(?:\\s+\\S+)*(?=\\s+Charlie\\b)")
> res
[1] NA NA "Jane saw"
这里,
-查找第一组0+空格字符,后跟\\s*
-子字符串Charlie
后跟Charlie
-字符串末尾的任何0+字符*
- 为什么不简单
sub('Charlie.*', '', x)
#[1] "" " " "Jane saw "
或
为什么不干脆
sub('Charlie.*', '', x)
#[1] "" " " "Jane saw "
或
谢谢你的详细解释!!它确实帮助我理解了你的代码!:)一如既往的好选择!仅供参考:根据问题判断,在第二种解决方案中不需要输入单词边界,但当问题提到单词时,我通常会自动插入它。如果您需要在文本包含
字符时进行匹配,请删除该\b
。感谢您的详细解释!!它确实帮助我理解了你的代码!:)一如既往的好选择!仅供参考:根据问题判断,在第二种解决方案中不需要输入单词边界,但当问题提到单词时,我通常会自动插入它。如果您需要在文本包含Charlies
时进行匹配,请删除该\b
。不知道R上有trimws()函数!非常感谢您的帮助!:)是的,如果要删除从字符串末尾的第一个Charlie
开始的所有文本,这将起作用。但是我会使用sub
而不是gsub
,因为预期只有一个替换。不知道R上有一个trimws()函数!非常感谢您的帮助!:)是的,如果要删除从字符串末尾的第一个Charlie
开始的所有文本,这将起作用。但是我会使用sub
而不是gsub
,因为预期只有1个替换。