使用正则表达式在折叠的单词之间插入空格

时间:2014-07-14 15:40:40

标签: regex r gsub

我正在研究R中的等值线,并且需要能够将状态名称与match.map()匹配。数据集I使用多个单词名称,如NorthDakota和DistrictOfColumbia。

如何使用正则表达式在低位字母序列之间插入空格?我已经成功添加了一个空间但是还没有能够保留那些指示空间去向的字母。

places = c("NorthDakota", "DistrictOfColumbia")
gsub("[[:lower:]][[:upper:]]", " ", places)
[1] "Nort akota"       "Distric  olumbia"

2 个答案:

答案 0 :(得分:11)

使用括号捕获匹配的表达式,然后使用\n(R中的\\n)来检索它们:

places = c("NorthDakota", "DistrictOfColumbia")
gsub("([[:lower:]])([[:upper:]])", "\\1 \\2", places)
## [1] "North Dakota"         "District Of Columbia"

答案 1 :(得分:11)

您希望使用capturing groups捕获匹配的上下文,以便您可以回复替换呼叫中的每个匹配组。要访问这些组,请在两个反斜杠\\之后加上组#

> places = c('NorthDakota', 'DistrictOfColumbia')
> gsub('([[:lower:]])([[:upper:]])', '\\1 \\2', places)
# [1] "North Dakota"         "District Of Columbia"

另一种方法是,使用perl=T启用PCRE并使用lookaround断言。

> places = c('NorthDakota', 'DistrictOfColumbia')
> gsub('[a-z]\\K(?=[A-Z])', ' ', places, perl=T)
# [1] "North Dakota"         "District Of Columbia"

<强>解释

\K转义序列会重置报告的匹配项的起始点,并且不再包含任何以前消耗的字符。基本上(抛弃了与此相匹配的所有内容。

[a-z]       # any character of: 'a' to 'z'
\K          # '\K' (resets the starting point of the reported match)
(?=         # look ahead to see if there is:
  [A-Z]     #   any character of: 'A' to 'Z'
)           # end of look-ahead