У меня есть дата, указанная в формате «28 октября 2010» (или simillar). Теперь я хочу изменить полное название месяца на более короткую версию (в этом случае Oct). Для этого я подготовил словарь:Странное поведение при замене строки в python
_mapping = {'January': 'Jan',
'February': 'Feb',
'March': 'Mar',
'April': 'Apr',
'May': 'May',
'June': 'Jun',
'July': 'Jul',
'August': 'Aug',
'September': 'Sep',
'October': 'Oct',
'November': 'Nov',
'December': 'Dec'}
и в методе, где substition идет, я написал следующее:
def fetch(self, pno):
...
date = #get data (working fine)
for l, s in self._mapping.iteritems():
pubdate = date.replace(l, s)
print l + " -> " + pubdate #this is only for debug
(pubd_month, self.pubd_day, self.pubd_year) = pubdate.split(' ')
print pubd_month, self.pubd_day, self.pubd_year
print pubdate
Результат исполнения является:
February -> October 28, 2008
October -> Oct 28, 2008
January -> October 28, 2008
April -> October 28, 2008
November -> October 28, 2008
March -> October 28, 2008
August -> October 28, 2008
May -> October 28, 2008
December -> October 28, 2008
June -> October 28, 2008
September -> October 28, 2008
July -> October 28, 2008
October
October 28, 2008
Как вы можете видеть кажется, что замена идет нормально, когда она находит октябрь, но за пределами цикла я снова получаю полное название месяца. Что я делаю неправильно?
Другой вопрос: существует ли более короткий способ сделать это?
Обратите внимание, что имена месяцев '% b' и'% B' зависят от локали. Я обнаружил, что если ваш код должен работать в разных средах, где вы не контролируете локаль, вы должны вручную выполнять месячные замены * в любом случае *. –
Можно ли принудительно использовать английский язык? – Moby04
Не совсем; Честно говоря, гораздо проще просто заменить струны. См. [Форматирование даты в Python] (http://stackoverflow.com/q/985505) для решения, которое * может * работать в системах POSIX при условии, что локаль была сгенерирована. –