【问题标题】:Check if string contains ONLY NUMBERS or ONLY CHARACTERS (R)检查字符串是否仅包含数字或仅包含字符(R)
【发布时间】:2017-04-03 22:45:43
【问题描述】:

我有这三个字符串:

letters <- "abc" 
numbers <- "123" 
mix <- "b1dd"

如何检查这些字符串中的哪一个仅包含字母或仅包含数字(在 R 中)?

letters 应该只在 LETTERS ONLY 检查中为 TRUE

numbers 只能在 NUMBERS ONLY 检查中为 TRUE

mix 在任何情况下都应该是 FALSE

我现在尝试了几种方法,但没有一个真正适合我:(

例如,如果我使用

grepl("[A-Za-z]", letters) 

它适用于 letters,但它也适用于 mix,这是我不想要的。

提前致谢。

【问题讨论】:

    标签: r regex


    【解决方案1】:
    # Check that it doesn't match any non-letter
    letters_only <- function(x) !grepl("[^A-Za-z]", x)
    
    # Check that it doesn't match any non-number
    numbers_only <- function(x) !grepl("\\D", x)
    
    letters <- "abc" 
    numbers <- "123" 
    mix <- "b1dd"
    
    letters_only(letters)
    ## [1] TRUE
    
    letters_only(numbers)
    ## [1] FALSE
    
    letters_only(mix)
    ## [1] FALSE
    
    numbers_only(letters)
    ## [1] FALSE
    
    numbers_only(numbers)
    ## [1] TRUE
    
    numbers_only(mix)
    ## [1] FALSE
    

    【讨论】:

    • numbers_only 仅适用于整数。如果您想在测试中包含分数,我建议使用numbers_only &lt;- function(x) suppressWarnings(!is.na(as.numeric(as.character(k)))),如下所述:stackoverflow.com/questions/24129124/…
    • @Mikko 是的,我将请求解释为“检查字符串中的每个字符是否都是数字。”所以它不会匹配分数、小数、科学记数法,甚至是带有千位分隔符的整数。如果一个人想识别“可以代表数字的字符串”,它就会变得依赖于文化。例如,根据美国文化惯例,一个数字可以包含多个逗号(千位分隔符),但只能包含一个句点(小数点),并且不能包含空格。但在许多其他国家/地区,逗号和句号的作用是颠倒的,或者使用空格作为千​​位或百万位分隔符。
    • 不应该是 !grepl("\\d", x) 吗? \\D 对我不起作用。谢谢。
    • 如果x 包含任何非数字,@BICube grepl("\\D", x) 将匹配。 (非数字大写 D)。因此,!grepl("\\D", x) 将匹配 x 包含任何非数字 - 即,如果 x 包含 only 数字。 (然而,如果 x 包含 no 位,!grepl("\\d", x) 将匹配。)
    【解决方案2】:

    你需要坚持你的正则表达式

    all_num <- "123"
    all_letters <- "abc"
    mixed <- "123abc"
    
    
    grepl("^[A-Za-z]+$", all_num, perl = T) #will be false
    grepl("^[A-Za-z]+$", all_letters, perl = T) #will be true
    grepl("^[A-Za-z]+$", mixed, perl=T) #will be false
    

    【讨论】:

    • perl=TRUE 不是必需的。
    • 我这样做只是为了安全@fexjoo 如果它满足您的需要,那么请选择我的答案来关闭 Q
    • 尝试all_letters2 &lt;- "ü" 使用[[:alpha:]] 可能更安全。
    【解决方案3】:

    使用stringr

    library(stringr)
    all_num <- "123"
    all_letters <- "abc"
    mixed <- "123abc"
    
    # LETTERS ONLY
    str_detect(all_num, "^[:alpha:]+$")
    str_detect(all_letters, "^[:alpha:]+$")
    str_detect(mixed, "^[:alpha:]+$")
    
    # NUMBERS ONLY
    str_detect(all_num, "^[:digit:]+$")
    str_detect(all_letters, "^[:digit:]+$")
    str_detect(mixed, "^[:digit:]+$")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2014-07-16
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多