r - r - 在句子中,如何添加被移除的空格?

我有以下字符串:


x = "marchTextIWantToDisplayWithSpacesmarch"



我想删除字符串开头的'march '部分,然后在余数中的每个大写字母前添加一个空格,以产生以下结果:


"Text I Want To Display With Spacesmarch"



插入空白,我用过gsub("([a-z]?)([A-Z])", "1 2", x, perl= T) 但是,我不知道如何修改模式,以便在返回的字符串中排除第一个'march ,我试图在这方面做得更好,所以,任何帮助都会非常感激。

时间:

不行.你无法使用单个gsub实现替换,因为在你的要求中,你要删除从开头开始的所有小写字母,第二个要求是在删除文本开头的所有小写字母之后,在每个大写字母之前引入空格,除第一个大写字母外,还需要先删除所有小写字母。

在单一的gsub调用中进行该操作是可能的,在某种情况下我们可以使用现有字符来替换条件。 因此,在第一步中,你可以使用^[a-z]+正规表达式从字符串开始处删除所有小写字母,


sub('^[a-z]+', '', "marchTextIWantToDisplayWithSpacesmarch")



把这个留给你


[1] "TextIWantToDisplayWithSpacesmarch"



下一步你可以用这个(?<^)(?=[A-Z])正规表达式在每个大写字母之前插入一个空格,! 但是你可以把两者结合起来写出来


gsub('(?<!^)(?=[A-Z])', ' ', sub('^[a-z]+', '', "marchTextIWantToDisplayWithSpacesmarch"), perl=TRUE)



它将给你所需的字符串


[1] "Text I Want To Display With Spacesmarch"



选项是将大写字母捕获为组((...) ),并在替换中创建一个空格,后跟捕获的组的后引用(1 ),


gsub("([A-Z])", " 1", x)


#[1] "march Text I Want To Display With Spacesmarch"



如果我们需要删除'march '


sub("b[a-z]w+s+", "", gsub("([A-Z])", " 1", x))


[#1] "Text I Want To Display With Spacesmarch"



数据


x <- "marchTextIWantToDisplayWithSpacesmarch"



你可以使用单个正规表达式调用gsub对和trimws来修剪结果字符串:


trimws(gsub("^p{Ll}+|(?<=.)(?=p{Lu})", " ", x, perl=TRUE))


## => [1] "Text I Want To Display With Spacesmarch"



它还支持所有Unicode小写(p{Ll} )和大写(p{Lu} )字母。

请参见R在线演示和正规表达式演示 。

详情

  • ^p{Ll}+ -字符串开始时的1或更多小写字母
  • | - 或者
  • (?<=.)(?=p{Lu}) -任何字符之间的任何字符,linebreak字符和大写字母,

下面是一个替代,它带有对gsubfn正规表达式的单个调用,并带有一些ifelse逻辑:


> gsubfn("^p{Ll}*(p{L})|(?<=.)(?=p{Lu})", function(n) ifelse(nchar(n)>0,n," "), x, perl=TRUE,backref=-1) 


[1] "Text I Want To Display With Spacesmarch"



这里,^p{Ll}*(p{L})部分匹配0+小写字母,并将下一个大写字母捕获到1组,将n参数传递给匿名函数,如果n长度为非零,则此替代匹配,我们需要用这个值替换,否则,我们用空格替换。

...