R正则表达式删除了apostroph,除了之前和之后的字母

时间:2017-01-28 21:41:11

标签: r regex

我正在清理文字,我想删除任何撇号,除了之前和之后的字母,例如: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])

但我觉得我还在遗失......

2 个答案:

答案 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]如果您想限制结果。

<强> → Here is your example on regex101 for live testing.