仅替换两个单词之间的空格,而不是单词和符号或单词和数字之间的空格

时间:2019-09-12 22:10:14

标签: r regex stringr

我正在尝试使用R中的stringer包识别单词之间的空格,但不能识别单词和符号之间的空格(反之亦然)或单词和数字之间的空格(反之亦然)数字。

根据我的发现,[A-Za-z] [:space:] [a-zA-Z]应该可以工作。我显然缺少了一些东西,但不确定是什么。

我已经尝试使用[A-Za-z] [:space:] [a-zA-Z]的字符串语法,以及[A-Za-z]等空格的regex(?)语法] \ s + [a-zA-Z]

str_replace_all(x, [A-Za-z][:space:][a-zA-Z], "_")

有时我会得到的错误是“ rep(value,length.out = nrows)错误:尝试复制'closure'类型的对象”

1 个答案:

答案 0 :(得分:1)

您可以使用

str_replace_all(x, "(?<=\\p{L})\\s(?=\\p{L})", "_")
gsub("(?<=\\p{L})\\s(?=\\p{L})", "_", x, perl=TRUE)

或者,如果有1个或多个空格要替换为1个_

str_replace_all(x, "(?<=\\p{L})\\s+(?=\\p{L})", "_")
gsub("(?<=\\p{L})\\s+(?=\\p{L})", "_", x, perl=TRUE)

请参见regex demo

详细信息

  • (?<=\p{L})-与后面紧跟任何字母的位置相匹配的正向外观
  • \s-空格(\s+匹配1个以上空格)
  • (?=\p{L})-一个正向超前匹配位置,该位置与后面紧跟任何字母的位置相匹配。

注意

  • 您应将正则表达式模式用引号引起来以形成字符串常量
  • 如果只想支持ASCII字母,则可以将\\p{L}替换为[A-Za-z]