如何使用正则表达式替换非数字字符

时间:2018-05-23 11:12:07

标签: regex python-3.x pandas dataframe

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

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 个答案:

答案 0 :(得分:1)

我认为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

答案 1 :(得分:1)

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

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

Live demo

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

Python代码:

re.sub(r"(\d+(?:\.\d+)?)|.", "$1", x) 

答案 2 :(得分:1)

我认为可以尝试:

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