对于文本字段,我想公开那些包含无效字符的字段。无效字符列表未知;我只知道接受的列表。
例如,对于法语,接受的列表是
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放在可接受的字符列表中?
答案 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:]
空格字符
任何带有变音符号的有效法语字符àâæçéèêëîïôœùûüÿ
连字符-
上面的代码替换了所有有效字符。结果是字符串中存在的所有无效字符。以下是输出:
x <- c("This is an 2-piece à-la-carte dessert", "Ã this Øs an apple")
gsub("[a-z1-9[:punct:] àâæçéèêëîïôœùûüÿ-]+", "", x, ignore.case=T)