2014-01-28 2 views
2
import re 
red_dict= {u'Jharkhand': ['jarka09', 'jarka05'], 
u'Karnataka': ['karnataka2013', 'karnatka2008']} 
for key, value in red_dict.items(): 
    num = re.findall(r'\d+',' '.join(value)) 
    map(lambda x: x if len(x)==4 else '20'+x, num) 
    print num 

Получение результатаДобавляя строку в список строк

['09', '05'] 
['2013', '2008'] 

Почему не «20» прилагаемую к двум список цифр элементов?

Для обычного использования, я могу подтвердить, что этот подход работает

l = ['a','b','cd'] 
map(lambda x:x if len(x)==2 else 'e'+x,l) 

дает

['ea', 'eb', 'cd'] 

ответ

2

map не заменяет данную num. Вы должны вернуть возвращаемое значение до num.

>>> a = [1, 2, 3] 
>>> map(lambda x: x + 1, a) 
[2, 3, 4] 
>>> a 
[1, 2, 3] 
>>> a = map(lambda x: x + 1, a) 
>>> a 
[2, 3, 4] 

num = map(lambda x: x if len(x)==4 else '20'+x, num) 
#^^^^ 
4

@ ответ falsetru в может решить вашу проблему, но только хорошо сформировавшимися regex на самом деле может сделать свою работу без какой-либо последующей обработки с map

Реализация

for key, value in red_dict.items(): 
    print [re.sub("^[^\d]+20|[^\d]+", "20", v) for v in value] 

Demo

['2009', '2005'] 
['2013', '2008'] 

Примечание

Для вашего конкретного случая, вы на самом деле не нужно даже Regex. Вы можете просто нарезать из замыкающего два символа и добавить его в '20'

for key, value in red_dict.items(): 
    print ['20' + v[-2:] for v in value] 
+0

Использование '\ D' вместо' [^ \ d] '. + Используйте 'r'raw string'' для регулярного выражения (особенно если есть обратная косая черта). – falsetru

+0

Версия регулярного выражения не будет работать для 'jarka20'. – falsetru

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