2016-12-21 3 views
4

я запустить программу:панды не str.replace получить ничего

# encoding=utf-8 
import pandas 
df=pandas.DataFrame([['11-20','a',1],['10-20  更新于16-10-20 18:07','b',2],['15-12-27','c',3],['15-10-26  更新于10-26 23:52','d',4]],columns=['date','name','type']) 
df.date=df.date.str.replace('^(\d+)(-)(\d+)((-)\d+){0,1}(.*)','\1\2\3\4') 
print df 

это результат:

date name type 
0   a  1 
1   b  2 
2   c  3 
3   d  4 

Я хочу, чтобы получить результат:

 date name type 
0  11-20 a  1 
1  10-20 b  2 
2 15-12-27 c  3 
3 15-10-26 d  4 

Я также проверить это regex на https://regex101.com/r/apIT0O/8. Но я не знаю, где проблема

ответ

1

Вам нужно сделать замену группы буквальным:

df.date.str.replace('^(\d+)(-)(\d+)((-)(\d+)){0,1}(.*)',r'\1\2\3\4') 

#0  11-20 
#1  10-20 
#2 15-12-27 
#3 15-10-26 
#Name: date, dtype: object 

Или вы можете использовать двойную обратную косую черту:

df.date.str.replace('^(\d+)(-)(\d+)((-)(\d+)){0,1}(.*)', '\\1\\2\\3\\4') 

без использования регулярных выражений , вы также можете разделить на пустое пространство и взять первый элемент:

df.date.str.split(" ").str[0] 

#0  11-20 
#1  10-20 
#2 15-12-27 
#3 15-10-26 
#Name: date, dtype: object 
+0

Да, это работает. но df.date.str.replace ('^ (\ d +) (-) (\ d +) ((-) (\ d +)) {0,1} (. *)', '\\ 1 \\ 2 \\ 3 \\ 4 ') работает только на python 3. +. Не могли бы вы сказать мне разницу? Благодаря! – pang2016

1

Вы можете упростить свое регулярное выражение.

df.date.str.replace('^(\d+-\d+)(-\d+)?.*',r'\1\2') 

Просмотреть демонстрационный файл.

https://regex101.com/r/apIT0O/9

Смежные вопросы