当[:punct:]太多了

时间:2013-05-06 13:08:42

标签: 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
  

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

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

gsub('[\\]\\[]', 'B', 'it[]') #double escape, reversed order, NO substitution
# [1] "it[]"

我不希望fixed=TRUEgsub一起使用,因为这会阻止我使用字符类。那么,如何在正则表达式字符类中包含方括号?

ETA附加试验:

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

gsub('[[\]]', 'B', 'it[]') #single escape on closing ] only, expected error
  

错误:']'是以''[[]“

开头的字符串中无法识别的转义符

ETA:单一替换是由于我的perl=T来电中没有设置gsub造成的。即:

gsub('[[\\]]', 'B', 'it[]', perl=T)

2 个答案:

答案 0 :(得分:12)

[:punct:]与<{3}}

组合使用时,可以使用(?!['-])[[:punct:]]
[:punct:]

这样,只有['-]不在(?!['-])内,才匹配'。负前瞻断言-确保了这种情况。当下一个字符是{{1}}或{{1}}时,它会失效,然后完整的表达式失败。

答案 1 :(得分:2)

在角色类中,您只需要转义结束方括号:

尝试使用'[[\\]]''[[\]]'(我不确定是否因为我不知道R而逃避反斜杠。)

请参阅this example