当[:punct:]太多了

dna*_*irl 9 regex r

我正在清理R中的文本字符串.我想删除撇号和连字符之外的所有标点符号.这意味着我不能使用[:punct:]角色类(除非有一种说法[:punct:] but not '-).

! " # $ % & ( ) * + , . / : ; < = > ? @ [ \ ] ^ _ { | } ~. 和反击必须出来.

对于上述大部分内容,转义不是问题.但对于方括号,我确实遇到了问题.这是我尝试过的:

gsub('[abc]', 'L', 'abcdef') #expected behaviour, shown as sanity check
# [1] "LLLdef"

gsub('[[]]', 'B', 'it[]') #only 1 substitution, ie [] treated as a single character
# [1] "itB"

gsub('[\[\]]', 'B', 'it[]') #single escape, errors as expected
Run Code Online (Sandbox Code Playgroud)

错误:'['是字符串中无法识别的转义"'[["

gsub('[\\[\\]]', 'B', 'it[]') #double escape, single substitution
# [1] "itB"

gsub('[\\]\\[]', 'B', 'it[]') #double escape, reversed order, NO substitution
# [1] "it[]"
Run Code Online (Sandbox Code Playgroud)

我宁愿不使用fixed=TRUE,gsub因为这将阻止我使用字符类.那么,如何在正则表达式字符类中包含方括号?

ETA附加试验:

gsub('[[\\]]', 'B', 'it[]') #double escape on closing ] only, single substitution
# [1] "itB"

gsub('[[\]]', 'B', 'it[]') #single escape on closing ] only, expected error
Run Code Online (Sandbox Code Playgroud)

错误:']'是以"'[[]"开头的字符串中无法识别的转义符

ETA:单一替换是由于未设置perl=T我的gsub呼叫引起的.即:

gsub('[[\\]]', 'B', 'it[]', perl=T)
Run Code Online (Sandbox Code Playgroud)

ste*_*ema 12

[:punct:]将它与负前瞻结合使用时,可以使用它

(?!['-])[[:punct:]]
Run Code Online (Sandbox Code Playgroud)

这种方式[:punct:]只有匹配,如果它不在['-].负前瞻断言(?!['-])确保了这种情况.当下一个字符是a '或a -然后整个表达式失败时它会失效.