Не принятие во внимание того, что Ваш текстовый файл повреждается (U+2018 является левой кавычкой, не апострофом): iconv может использоваться для транслитерации unicode символов к ASCII
, необходимо будет погуглить для "iconvcodec", так как модуль, кажется больше, не поддерживается, и я не могу найти каноническую домашнюю страницу для него.
>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"
, Кроме того, можно использовать iconv
утилита командной строки для чистки файла:
$ xxd foo
0000000: e280 980a ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a '.
Мое предложение:
(?:(?:(?<hh>\d{1,2})[:.])?(?<mm>\d{1,2})[:.])?(?<ss>\d{1,2})
структурированный:
(?: # group 1 (non-capturing)
(?: # group 2 (non-capturing)
(?<hh>\d{1,2}) # hours
[:.] # delimiter
)? # end group 2, make optional
(?<mm>\d{1,2}) # minutes
[:.] # delimiter
)? # end group 1, make optional
(?<ss>\d{1,2}) # seconds (required)
Если хотите, вы можете заключить регулярное выражение в разделители - например, границы слов \ b
или привязки строк ( ^
и $
).
РЕДАКТИРОВАТЬ: Подумав об этом, вы можете ограничить это дополнительно, чтобы захватить только время, которое имеет смысл. Используйте
[0-5]?\d
вместо
\d{1,2}
, чтобы фиксировать только значения от 0 до 59, где это необходимо (секунды и минуты).
Я еще не тестировал это, но он должен работать:
^(?:(?:(?<hours>\d\d?)[:\.])?(?<minutes>\d\d?)[:\.])?(?<seconds>\d\d?)$
Изменить:
Теперь я его протестировал и убедился, что он работает. :)
Я предлагаю следующее выражение.
^ (((?
Это позволит сочетать однозначные часы с однозначными минутами, например 3 : 7: 21
. Если это нежелательно, требуется небольшое изменение.
^ (((?
Утверждение положительного просмотра вперед ( ? = [0-9] {2})
во втором выражении решает эту проблему.
для этого нет подходящего способа, так как это действительно зависит от вашей конкретной ситуации, что делать, если не все три части указаны. Например, во многих случаях я бы предпочел интерпретировать 3:30 как 3 часа 30 минут вместо 3 минут 30 секунд. Это не повредит, если я буду говорить об этом прямо и упростить вывод из регулярного выражения того, что означают эти типы входных данных.
Поэтому я лично считаю, что первое регулярное выражение вовсе не так уродливо - оно может быть менее "волшебным" ", но он намного удобнее для чтения и сопровождения. Убедитесь, что вы и другие пользователи все еще можете читать и изменять код позже!
Если ваш язык поддерживает это, я бы использовал расширенные регулярные выражения (с поддержкой пробелов и комментариев) и разделил бы его на три строки (или 6 или 9, если вы поместите комментарий отдельной строкой). Это победило