在R中保留正则表达式字符

在R中保留正则表达式字符,r,regex,gsub,R,Regex,Gsub,我有一堆文本文档,在某些情况下,这些文档中的单词以某种方式连接在一起,它们有时看起来像这样:“ThreeWordsTogether” 我希望他们看起来像:“三个字在一起” 我尝试使用gsub函数以这种方式生成所需的字符串: gsub("[a-z][A-Z][a-z]", "[a-z] [A-Z][a-z]", "ThreeWordsTogether") 可以预见的是,结果是:“Thre[a-z][a-z][a-z]rd[a-z][a-z][a-z]gether” 我在gsub文档中没有看到任何

我有一堆文本文档,在某些情况下,这些文档中的单词以某种方式连接在一起,它们有时看起来像这样:“ThreeWordsTogether”

我希望他们看起来像:“三个字在一起”

我尝试使用gsub函数以这种方式生成所需的字符串:

gsub("[a-z][A-Z][a-z]", "[a-z] [A-Z][a-z]", "ThreeWordsTogether")
可以预见的是,结果是:“Thre[a-z][a-z][a-z]rd[a-z][a-z][a-z]gether”

我在gsub文档中没有看到任何建议您可以保留正则表达式“[a-z][a-z][a-z]”捕获的字符的内容


在R中是否有这样做的方法,或者这是正则表达式匹配的限制之一?(我对这一点比较陌生)

一种方法是使用
snakecase
软件包:

snakecase::to_any_case("ThreeWordsTogether", case = "big_camel", sep_out = " ")

一种方法是使用
snakecase
软件包:

snakecase::to_any_case("ThreeWordsTogether", case = "big_camel", sep_out = " ")

您需要使用捕获组,捕获组由
()
定义,并由
\1
\2
按照它们在模式中出现的顺序引用(您必须转义,因此实际上是两个
\
)。我使用
stringr
,但您也可以使用
gsub
来实现这一点。这基本上是说,找到一个小写字母,后跟一个大写字母,并返回它们之间的空格。请注意,这将适用于任何数量的单词,并留下现有单词单独,但将不会工作任何单词发生在大写字母中的任何原因。你必须不断调整它以适应你的环境-例如,现在如果一个单词的结尾不是小写字母,它就不会分裂

库(stringr)
字符串%
str_replace_all(“([a-z])([a-z])”,“\\1\\2”)
#>[1]“两个字”“三个字在一起”
#>[3]“三个字分开”“四个字在一起”
#>[5]“我的帽子”

由(v0.2.0)于2018年7月17日创建。

您需要使用捕获组,捕获组由
()
定义,并由
\1
\2
按照它们在模式中出现的顺序引用(您必须转义,因此实际上是两个
\
)。我使用
stringr
,但您也可以使用
gsub
来实现这一点。这基本上是说,找到一个小写字母,后跟一个大写字母,并返回它们之间的空格。请注意,这将适用于任何数量的单词,并留下现有单词单独,但将不会工作任何单词发生在大写字母中的任何原因。你必须不断调整它以适应你的环境-例如,现在如果一个单词的结尾不是小写字母,它就不会分裂

库(stringr)
字符串%
str_replace_all(“([a-z])([a-z])”,“\\1\\2”)
#>[1]“两个字”“三个字在一起”
#>[3]“三个字分开”“四个字在一起”
#>[5]“我的帽子”

由(v0.2.0)于2018年7月17日创建。

这是对关于蛇案解决方案问题的评论。(我认为作为一个单独的答案更容易理解。)因此,为了抑制“That's”中“s”的大写转换,使用和原始问题的答案主要有两种选择

两者都需要将中的sep_设置为不同于其默认值(
“[^[:alnum:][]”
)的值,例如,
sep_in=NULL
,以不处理”输入分隔符(并因此用“_>替换)

第一个选项然后使用
parsing\u option=-1
。将减号添加到
parsing_选项
通常会抑制在snakecase pkg中的非字母数字字符之后触发大小写转换

strings[1]“两个字”“三个字在一起”
#>[3]“三个字分开”“四个字在一起”
#>[5]“Mi Ddle Caps”“那是”
另一个选项使用
snakecase::to_title_case()
,它在内部将
snakecase::to_句_case()
中的一些部分与
tools::toTitleCase()
组合在一起(即在应用
tools::toTitleCase()
之前,“thas”首先转换为“thas”)

snakecase::to_title_case(字符串,sep_in=NULL)
#>[1]“两个字”“三个字在一起”
#>[3]“三个字分开”“四个字在一起”
#>[5]“Mi Ddle Caps”“那是”

由(v0.3.0)创建于2019-08-01这是对关于蛇案解决方案问题的评论。(我认为作为一个单独的答案更容易理解。)因此,为了抑制“That's”中“s”的大写转换,使用和原始问题的答案主要有两种选择

两者都需要将中的sep_设置为不同于其默认值(
“[^[:alnum:][]”
)的值,例如,
sep_in=NULL
,以不处理”输入分隔符(并因此用“_>替换)

第一个选项然后使用
parsing\u option=-1
。将减号添加到
parsing_选项
通常会抑制在snakecase pkg中的非字母数字字符之后触发大小写转换

strings[1]“两个字”“三个字在一起”
#>[3]“三个字分开”“四个字在一起”
#>[5]“Mi Ddle Caps”“那是”
另一个选项使用
snakecase::to_title_case()
,它在内部将
snakecase::to_句_case()
中的一些部分与
tools::toTitleCase()
组合在一起(即在应用
tools::toTitleCase()
之前,“thas”首先转换为“thas”)

snakecase::to_title_case(字符串,sep_in=NULL)
#>[1]“两个字”“三个字在一起”
#>[3]“三个字分开”“四个字在一起”
#> [5]