как заменить нечисловые символы с помощью регулярных выражений - PullRequest
0 голосов
/ 23 мая 2018

Мне интересно, как с помощью регулярных выражений удалить любые нечисловые символы, выбирая только непустые и пробелы (одно значение может содержать один или несколько пробелов) для ряда более эффективным способом,

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 голосов
/ 23 мая 2018

Вы можете сопоставлять и захватывать числа и сопоставлять что-либо еще:

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

Живая демоверсия

Затем замените совпадение на $1 (обратная ссылкапервой группе захвата)

Код Python:

re.sub(r"(\d+(?:\.\d+)?)|.", "$1", x) 
0 голосов
/ 23 мая 2018

думаю можно попробовать:

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
0 голосов
/ 23 мая 2018

Я считаю, что нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...