R regex匹配已知字符以外的内容

时间:2018-03-15 15:22:33

标签: r regex

对于文本字段,我想公开那些包含无效字符的字段。无效字符列表未知;我只知道接受的列表。 例如,对于法语,接受的列表是 A-z, 1-9, [punc::], space, àéèçè, hyphen, etc.

无效字符列表未知,但我想要重新出现任何异常,例如,我想要

This is an 2-piece à-la-carte dessert

时传递

'Ã this Øs an apple'充当了异常

R中的“不包含”概念并不像我希望的那样,例如

grep("[^(abc)]",c("abcdef", "defabc", "apple") )

(那些不包含'abc'的那些)匹配所有三个

grep("(abc)",c("abcdef", "defabc", "apple") )

行为正确且仅匹配前两个。我错过了什么

我们怎样才能在R中做到这一点?另外,我们如何将hypen放在可接受的字符列表中?

2 个答案:

答案 0 :(得分:3)

如果通过“公开无效字符”表示删除“已接受”字符,那么正则表达式字符类应该会有所帮助。从?regex帮助页面我们可以看到连字符已经是标点字符向量的一部分;

[:punct:]
Punctuation characters:
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

所以代码可以是:

x <- 'Ã this Øs an apple'
gsub("[A-z1-9[:punct:] àéèçè]+", "", x)

#[1] "ÃØ"

请注意,正则表达式有一个预定义的,特定于语言环境的"[:alpha:]"命名字符类,它可能比表达式“[A-zàéèçè]”更安全,更紧凑,特别是因为来自ctwheels的帖子表明你错过了一些。 ?regex页面表明“[0-9A-Za-z]”可能是区域设置和编码特定的。

如果通过“公开”而改为意味着“识别字符串中的位置”,那么你可以在字符类形式中使用否定运算符“^”并应用gregexpr

gregexpr("[^A-z1-9[:punct:] àéèçè]+",  x)
[[1]]
[1] 1 8
attr(,"match.length")
[1] 1 1

答案 1 :(得分:3)

db.create_all()

以上正则表达式匹配以下任何一项(一次或多次)。请注意,下面的代码中使用的参数[a-z1-9[:punct:] àâæçéèêëîïôœùûüÿ-]+ 允许以下内容也匹配字母的大写变体。

  • ignore.case=T任何小写ASCII字母
  • a-z任意数字,范围从1到9(不包括0)
  • 1-9任何标点字符
  • [:punct:]空格字符
  • 任何带有变音符号的有效法语字符
  • àâæçéèêëîïôœùûüÿ连字符

See code in use here

-

上面的代码替换了所有有效字符。结果是字符串中存在的所有无效字符。以下是输出:

x <- c("This is an 2-piece à-la-carte dessert", "Ã this Øs an apple")
gsub("[a-z1-9[:punct:] àâæçéèêëîïôœùûüÿ-]+", "", x, ignore.case=T)