【问题标题】:Remove the numeric portion of alphanumeric strings but keep the pure numbers删除字母数字字符串的数字部分,但保留纯数字
【发布时间】:2018-08-28 05:37:21
【问题描述】:

我正在尝试清理一些包含字母和数字组合的字符串

a <- c("Hello World","Hello4 World","12345","Hello World 4","4Hello World5","Hello 4", "Hello4")

我正在尝试删除字母数字字符串的数字部分,但保留纯数字,或者当数字用空格分隔时,我正在寻找的输出是。

b <- c("Hello World","Hello World","12345","Hello World 4","Hello World", "Hello 4","Hello")

字符串可以是任何东西,不一定是“Hello”或“World”,我尝试了各种正则表达式组合,但无法得到我想要的。

任何帮助将不胜感激!

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:
    gsub('(?i)(?<=[a-z])\\d+|\\d+(?=[a-z])','',a,perl=T)
    [1] "Hello World"   "Hello World"   "12345"         "Hello World 4" "Hello World"   "Hello 4"       "Hello"   
    

    说明:

    • ?i 用于忽略大小写。即你也可以使用参数ignore.case = TRUE

    • (?&lt;=[a-z])\\d+ 这是一个查找数字,即\\d+ immediately preceded by a letter(?

    • |

    • \\d+(?=[a-z]) 这是一种先行查找,您可以在其中查找数字 \\d+,紧跟字母 (?=[a-z])

    用空字符串替换它。即replacement =''gsub函数的第二个参数

    gsub('([a-z])\\d+|\\d+([a-z])','\\1\\2',a,ignore.case = T)
    [1] "Hello World"   "Hello World"   "12345"         "Hello World 4" "Hello World"   "Hello 4"       "Hello" 
    

    这遵循几乎相同的技巧,但我们使用反向引用而不是使用环视。

    • ([a-z])\\d+capture 紧接在数字前面的字母作为第 1 组
    • |\\d+([a-z]) 捕获紧跟数字的字母 作为第 2 组

    现在用捕获的字母替换整个表达式,即\\1\\2

    您可以根据需要混合使用这两个正则表达式。

    【讨论】:

    • 你能解释一下语法吗?
    【解决方案2】:

    按空格分割输入后使用正则表达式

    [A-Za-z] - all letters 
    
    ^[0-9] - all digits
    

    【讨论】:

    • 能否请您展示此代码/指令如何解决 OP 问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 2019-07-31
    • 2014-01-07
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多