R正则表达式删除字母之间的撇号

时间:2016-06-12 20:10:29

标签: regex r

我能够在保留撇号的同时从字符串中删除所有标点符号,但我现在仍然坚持如何删除不在两个字母之间的任何撇号。

str1 <- "I don't know 'how' to remove these ' things"

应该是这样的:

"I don't know how to remove these things"

3 个答案:

答案 0 :(得分:4)

您可以使用正则表达式方法:

str1 <- "I don't know 'how' to remove these ' things"
gsub("\\s*'\\B|\\B'\\s*", "", str1)

请参阅this IDEONE demoregex demo

正则表达式匹配:

  • \\s*'\\B - 0+空格,'和非字边界
  • | - 或
  • \\B'\\s* - 非字边界,'和0+空格

如果您不需要关心在删除独立'后可以保留的额外空格,则可以使用PCRE正则表达式

\b'\b(*SKIP)(*F)|'

请参阅the regex demo

<强>解释

  • \b'\b - 匹配'个中间字词
  • (*SKIP)(*F) - 并省略匹配
  • | - 或匹配......
  • ' - 另一种情况下的撇号。

查看IDEONE demo

gsub("\\b'\\b(*SKIP)(*F)|'", "", str1, perl=TRUE)

要考虑Unicode字母之间的撇号,请在模式的开头添加(*UTF)(*UCP)标记并使用perl=TRUE参数:

gsub("(*UTF)(*UCP)\\s*'\\B|\\B'\\s*", "", str1, perl=TRUE)
      ^^^^^^^^^^^^                              ^^^^^^^^^     

或者

gsub("(*UTF)(*UCP)\\b'\\b(*SKIP)(*F)|'", "", str1, perl=TRUE) 
      ^^^^^^^^^^^^                                 

请参阅another IDEONE demo

答案 1 :(得分:4)

此方法使用gsub工作:

gsub("(([^A-Za-z])'|'([^A-Za-z]))", "\\2 ", str1)

"I don't know  how to remove these   things"

需要第二轮来移除额外的空间。所以

gsub("  +", " ", gsub("(([^A-Za-z])'|'([^A-Za-z]))", "\\2 ", str1))
  • [^ A-Za-z]表示所有非字母字符
  • |是一个或声明
  • ()捕获匹配的子表达式
  • \\ 2被称为后向引用并返回第二个捕获的子表达式

答案 2 :(得分:3)

以下是在base中使用lookarounds的一种方法:

gsub("(?<![a-zA-Z])(')|(')(?![a-zA-Z])", "", str1, perl=TRUE)
## [1] "I don't know how to remove these  things"

Regular expression visualization