代码之家  ›  专栏  ›  技术社区  ›  daiyue

如何使用regex替换非数字字符

  •  0
  • daiyue  · 技术社区  · 6 年前

    我想知道如何使用regex删除任何非数字字符,同时只为一个系列选择非空和空格(一个值可能包含一个或多个空格)值,以更有效的方式,

    df['numeric_no'] = df['id'].apply(lambda x: re.sub("[^0-9]", "", x))
    df = df[(df['numeric_no'] != '') & (df['numeric_no'] != ' ')]
    

    一些示例数据 df

    numeric_no
    B-27000
    44-11-E
    LAND-11-4
    17772A
    88LL9A
    321LP-3
    UNIT 9 CAM -00-12
    WWcard_055_34QE
    EE119.45
    aaa
    b  b
    

    结果会像

    numeric_no
    27000
    4411
    114
    17772
    889
    3213
    90012
    05534
    119.45
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    我相信需要 str.findall 具有 boolean indexing :

    s = df['numeric_no'].str.findall("(\d*\.\d+|\d+)").str.join('')
    
    s = s[s.astype(bool)]
    print (s)
    
    0     27000
    1      4411
    2       114
    3     17772
    4       889
    5      3213
    6     90012
    7     05534
    8    119.45
    Name: numeric_no, dtype: object
    
        2
  •  1
  •   revo shanwije    6 年前

    您可以匹配和捕获数字,以及匹配任何其他内容:

    (\d+(?:\.\d+)?)|.
    

    Live demo

    然后将匹配项替换为 $1 (对第一个捕获组的后引用)

    python代码:

    re.sub(r"(\d+(?:\.\d+)?)|.", "$1", x) 
    
        3
  •  1
  •   Scott Boston    6 年前

    我想可以试试:

    df.numeric_no.str.extractall('(\d+?[\.\d+])').astype(str).sum(level=0)
    

    输出:

            0
    0    2700
    1    4411
    2      11
    3    1777
    4      88
    5      32
    6    0012
    7    0534
    8  119.45