Rik Poggi 是对的,字符串 'Июнь' 不能是一个月python-dateutil
。深入挖掘一下dateutil/parser.py
,基本问题是该模块的国际化程度仅足以处理西欧拉丁文字语言。它的设计目的不是能够处理使用非拉丁文字(例如西里尔字母)的语言(例如俄语)。
最大的障碍在于dateutil/parser.py:45-48
,其中词法分析器class _timelex
定义可以在标记中使用的字符,包括月份和日期名称:
class _timelex(object):
def __init__(self, instream):
# ... [some material omitted] ...
self.wordchars = ('abcdfeghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'
'ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'
'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ')
self.numchars = '0123456789'
self.whitespace = ' \t\r\n'
Because wordchars
不包括西里尔字母,_timelex
将日期字符串中的每个字节作为单独的字符发出。这是瑞克观察到的。
另一个很大的障碍是dateutil
在内部使用 Python 字节字符串而不是 Unicode 字符串进行所有处理。这意味着,即使 _timelex 被扩展为接受西里尔字母,那么字节和字符的处理之间仍然会存在不匹配,以及调用者和调用者之间的字符串编码差异导致的问题。python_dateutil
源代码。
还有其他一些小问题,例如假设每个月份名称至少有 3 个字符长(对于日语而言并非如此),以及许多与公历相关的细节。这将有助于wordchars
从中选取的字段parserinfo
如果存在,则 parserinfo 可以为其月份和日期名称定义正确的字符集。
python_dateutil
v 2.0已经移植到Python 3,但是上述设计问题并没有明显改变。 2.0 和 1.5 之间的差异是处理 Pyhon 语言的更改,而不是 dateutil 的设计和数据结构。
Oleg,您能够修改 parserinfo,我怀疑您成功了,因为您的测试代码没有使用parser()
(and _timelex
) of python_dateutil
。您实质上提供了自己的解析器和词法分析器。
纠正这个问题需要对文本处理进行相当大的改进python_dateutil
。如果有人针对该更改制作补丁,并且包维护者能够将其合并,那就太好了。