2017-07-10 238 views
2

我正在对数据框中的一系列单独名称进行一些数据清理。我想删除每个名称末尾的非字母字符。从字符串末尾删除多个非字母字符

countries <- c("Senegal1345769", "Canada&", "Austria12", "Spain-", "Russia#$") 

在上述情况下,我愿意把国家分为:

[1] "Senegal" "Canada" "Austria" "Spain" "Russia" 

我可以用gsub()与角色特有的模式(例如,pattern = ",$"),但我不太清楚如何对具有多个变化的尾随非alpha的字符串(例如,"Senegal1345769")执行此操作。

将使用什么样的模式来解决此问题?

+2

你可以试试'gsub(“[^ [:alpha:]] * $”,“”,countries)'。 – Scarabee

+0

'(?i)[^ a-z] + $'但是要注意,这并不检查alpha字符。 – sln

+0

我认为这可行,@ d.b!感谢大家。我很感激。快速问题:我最初使用“[^:alpha:] + $”;为什么这不起作用?只是试图更好地理解这个问题出了什么问题。 –

回答

1

您最初的尝试[^:alpha:]+$几乎是正确的。你只需要记住在括号表达式中应该使用POSIX字符类(如[:alpha:])。

使用

countries <- c("Senegal1345769", "Canada&", "Austria12", "Spain-", "Russia#$") 
sub("[^[:alpha:]]+$", "", countries) 
## => [1] "Senegal" "Canada" "Austria" "Spain" "Russia" 

online R demo

详细

  • [^ - 一个否定括号表达式
    • [:alpha:]开始 - 信POSIX字符类...
  • ]+ - 一个或多个次
  • $ - 字符串结尾。

因此,[^[:alpha:]]+$模式匹配字符串末尾的字母以外的一个或多个字符。

在这种情况下,表达无法工作,你也可以尝试一个PCRE模式:

sub("(*UCP)\\P{L}+$", "", countries, perl=TRUE) 

another online R demo

这里,

  • (*UCP) - 使模式支持Unicode
  • \\P{L}+ - 字符串的结尾 - 1个或多个字符除字母
  • $等。