我正在清理文字,我想删除任何撇号,除了之前和之后的字母,例如:i' m,i' ll,he&#39 ; s..etc
我的以下初步解决方案,处理了很多案例,但我想要一个更好的案例:
rmAps <- function(x) gsub("^\'+| \'+|\'+ |[^[:alpha:]]\'+(a-z)*|\\b\'*$", " ", x)
rmAps("'i'm '' ' 'we end' '")
[1] " i'm we end "
我也尝试过:
(?<![a-z])'(?![a-z])
但我觉得我还在遗失......
答案 0 :(得分:2)
gsub("'(?!\\w)|(?<!\\w)'", "", x, perl = TRUE)
#[1] "i'm we end "
删除角色后面没有单词字符的情况:'(?!\\w)
。
删除角色前面没有单词字符的情况:(?<!\\w)'
。
如果出现上述任何一种情况,您希望将其删除,因此'(?!\\w)|(?<!\\w)'
应该可以解决问题。请注意\\w
包含下划线,并根据需要进行调整。
另一种选择是
gsub("\\w'\\w(*SKIP)(*FAIL)|'", "", x, perl = TRUE)
在这种情况下,您匹配'
被单词字符包围的任何实例:\\w'\\w
,然后强制该匹配失败并使用(*SKIP)(*FAIL)
。但是,也请使用'
查找|'
。结果是,只有'
未包含在单词字符中的匹配项才会被匹配并替换掉。
答案 1 :(得分:1)
您可以使用以下正则表达式:
(?<=\w)'(?=\w)
(?<=)
是一个积极的看法。内部的所有内容都需要在下一个选择器之前匹配(?=)
是一个积极的向前看。内部的所有内容都需要在上一个选择器\w
任何字母数字字符和下划线 您也可以将\w
切换为例如[a-zA-Z]
如果您想限制结果。