Соответствие часам/минутам/секундам в регулярных выражениях - лучший путь?

Не принятие во внимание того, что Ваш текстовый файл повреждается (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                                     '.
7
задан Kjensen 9 September 2009 в 15:05
поделиться

4 ответа

Мое предложение:

(?:(?:(?<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, где это необходимо (секунды и минуты).

10
ответ дан 6 December 2019 в 10:52
поделиться

Я еще не тестировал это, но он должен работать:

^(?:(?:(?<hours>\d\d?)[:\.])?(?<minutes>\d\d?)[:\.])?(?<seconds>\d\d?)$

Изменить:
Теперь я его протестировал и убедился, что он работает. :)

5
ответ дан 6 December 2019 в 10:52
поделиться

Я предлагаю следующее выражение.

^ (((? [0-9] {1,2}) [.:])? (? [ 0-9] {1,2}) [.:])? (? [0-9] {2}) $

Это позволит сочетать однозначные часы с однозначными минутами, например 3 : 7: 21 . Если это нежелательно, требуется небольшое изменение.

^ (((? [0-9] {1,2}) [.:] (? = [0-9] {2}) )? (? [0-9] {1,2}) [.:])? (? [0-9] {2}) $

Утверждение положительного просмотра вперед ( ? = [0-9] {2}) во втором выражении решает эту проблему.

2
ответ дан 6 December 2019 в 10:52
поделиться

для этого нет подходящего способа, так как это действительно зависит от вашей конкретной ситуации, что делать, если не все три части указаны. Например, во многих случаях я бы предпочел интерпретировать 3:30 как 3 часа 30 минут вместо 3 минут 30 секунд. Это не повредит, если я буду говорить об этом прямо и упростить вывод из регулярного выражения того, что означают эти типы входных данных.

Поэтому я лично считаю, что первое регулярное выражение вовсе не так уродливо - оно может быть менее "волшебным" ", но он намного удобнее для чтения и сопровождения. Убедитесь, что вы и другие пользователи все еще можете читать и изменять код позже!

Если ваш язык поддерживает это, я бы использовал расширенные регулярные выражения (с поддержкой пробелов и комментариев) и разделил бы его на три строки (или 6 или 9, если вы поместите комментарий отдельной строкой). Это победило

1
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: