如何在一个字符串中删除特殊字符,空格和修剪R中的字符变量

Duc*_*uck 7 regex r

我在R中遇到一个带有字符类型变量的问题.我在数据框中的变量有这样的结构:

X1
ANGLO AUTOMOTRIZ S.A. MATRIZ
AUTOMOTORES Y ANEXOS / AYASA
ECUA - AUTO S.A. MATRIZ
METROCAR S.A. 10 DE AGOSTO
MOSUMI LA "Y"
Run Code Online (Sandbox Code Playgroud)

我的问题是我想要一个没有的新变量./-"",字符串必须组成一个没有空格,如下所示:

X2
ANGLOAUTOMOTRIZSAMATRIZ
AUTOMOTORESYANEXOSAYASA
ECUAAUTOSAMATRIZ
METROCARSA10DEAGOSTO
MOSUMILAY
Run Code Online (Sandbox Code Playgroud)

可以在R中做到这一点.谢谢.

Sim*_*lon 13

试试gsub......

gsub( "\\.|/|\\-|\"|\\s" , "" , df$X1 )
#[1] "ANGLOAUTOMOTRIZSAMATRIZ" "AUTOMOTORESYANEXOSAYASA" "ECUAAUTOSAMATRIZ"       
#[4] "METROCARSA10DEAGOSTO"    "MOSUMILAY"  
Run Code Online (Sandbox Code Playgroud)
  • \\. - 匹配文字 .
  • | - OR分隔符
  • /- 匹配a /(不需要转义)
  • \\- - 匹配文字 -
  • \" - 匹配文字 "
  • \\s - 匹配一个空格

gsub贪婪,所以尝试尽可能多地匹配,并且它也被矢量化,所以你可以立即传递整个列.第二个参数是替换值,在本例中是替换值,它将""所有匹配的字符替换为空.

  • 更简单:`gsub('[^ a-zA-Z0-9]','',df $ X1)`."^"字符是你最好的朋友! (3认同)
  • @Duck有点难以回答,取决于确切的编码等.试试这个页面的starters- http://www.regular-expressions.info/unicode.html (2认同)

A5C*_*2T1 6

既然你也在处理重音字符,我可以想到两个选择:

  1. 完全摆脱重音字符.
  2. 使用iconv尝试"音译"重音字符的ASCII字符.

这两个都是.对于这两个示例,我使用以下示例文本:

Z <- c("ANGLO AUTOMOTRIZ S.A. MATRIZ", "AUTOMOTORES Y ANEXOS / AYASA",
"ECUA - AUTO S.A. MATRIZ", "METROCAR S.A. 10 DE AGOSTO", "MOSUMI LA \"Y\"",
"distribuir contenidos", "proponer autoevaluaciones", "como buzón de actividades")
Run Code Online (Sandbox Code Playgroud)

选项1:请注意,重音"ó"将在最后一项中删除.

gsub("[^[:ascii:]]|[[:punct:]]|[[:space:]]", "", Z, perl=TRUE)
# [1] "ANGLOAUTOMOTRIZSAMATRIZ"  "AUTOMOTORESYANEXOSAYASA"  "ECUAAUTOSAMATRIZ"        
# [4] "METROCARSA10DEAGOSTO"     "MOSUMILAY"                "distribuircontenidos"    
# [7] "proponerautoevaluaciones" "comobuzndeactividades"   
Run Code Online (Sandbox Code Playgroud)

选项2:注意"ó"已转换为"o"

gsub("[[:punct:]]|[[:space:]]", "", iconv(Z, to = "ASCII//TRANSLIT"))
# [1] "ANGLOAUTOMOTRIZSAMATRIZ"  "AUTOMOTORESYANEXOSAYASA"  "ECUAAUTOSAMATRIZ"        
# [4] "METROCARSA10DEAGOSTO"     "MOSUMILAY"                "distribuircontenidos"    
# [7] "proponerautoevaluaciones" "comobuzondeactividades"  
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 为方便起见,我决定只使用字符类[[:punct:]][[:space:]].
  • 对于第一个选项,您需要perl = TRUE识别[[:ascii:]]字符类.
  • ^选项1中的意思是"不"(这样,你可以把它读作"发现了什么,是不是一个ASCII字符,这是一个空间,或者说是一个标点符号,用什么替代它).

  • 'iconv(Z,to ="ASCII // TRANSLIT")的+1,感谢您添加此作为答案! (2认同)