我能够在保留撇号的同时从字符串中删除所有标点符号,但我现在仍然坚持如何删除不在两个字母之间的任何撇号。
str1 <- "I don't know 'how' to remove these ' things"
应该是这样的:
"I don't know how to remove these things"
答案 0 :(得分:4)
您可以使用正则表达式方法:
str1 <- "I don't know 'how' to remove these ' things"
gsub("\\s*'\\B|\\B'\\s*", "", str1)
请参阅this IDEONE demo和regex demo。
正则表达式匹配:
\\s*'\\B
- 0+空格,'
和非字边界|
- 或\\B'\\s*
- 非字边界,'
和0+空格如果您不需要关心在删除独立'
后可以保留的额外空格,则可以使用PCRE正则表达式
\b'\b(*SKIP)(*F)|'
<强>解释强>:
\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)
^^^^^^^^^^^^
答案 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))
答案 2 :(得分:3)
以下是在base中使用lookarounds的一种方法:
gsub("(?<![a-zA-Z])(')|(')(?![a-zA-Z])", "", str1, perl=TRUE)
## [1] "I don't know how to remove these things"