Регулярный шаблон выражения для даты и времени [дубликат]

Это можно сделать, используя toolz.concat или cytoolz.concat (cythonized версия, которая в некоторых случаях может быть быстрее):

from cytoolz import concat
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(concat(l)) # or just `concat(l)` if one only wants to iterate over the items

На моем компьютере, в python 3.6, это похоже на время почти так же быстро, как [item for sublist in l for item in sublist] (не считая времени импорта):

In [611]: %timeit L = [item for sublist in l for item in sublist]
695 ns ± 2.75 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [612]: %timeit L = [item for sublist in l for item in sublist]
701 ns ± 5.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [613]: %timeit L = list(concat(l))
719 ns ± 12 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [614]: %timeit L = list(concat(l))
719 ns ± 22.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Версия toolz действительно медленнее:

In [618]: from toolz import concat

In [619]: %timeit L = list(concat(l))
845 ns ± 29 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [620]: %timeit L = list(concat(l))
833 ns ± 8.73 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

36
задан abatishchev 27 April 2012 в 07:41
поделиться

12 ответов

@Espo: Мне просто нужно сказать, что регулярное выражение невероятно. Мне бы очень хотелось написать код, который сделал что-то полезное в матчах, например, если вы действительно хотите узнать, какая дата и время набрал пользователь.

Кажется, что решение Тома будет больше поскольку это примерно в два миллиона раз проще и с добавлением некоторых круглых скобок вы можете легко получить значения, введенные пользователем:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

Если вы используете perl, то вы можете получить выдает что-то вроде этого:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

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

46
ответ дан Greg Hewgill 5 September 2018 в 07:23
поделиться

Вы должны найти то, что ищете в http://regexlib.com/DisplayPatterns.aspx?cattabindex=4&categoryId=5 .

0
ответ дан Brian Matthews 5 September 2018 в 07:23
поделиться

относительно ответа Имрана с 1 сентября 2008 года в 12:33, отсутствует: в шаблоне правильные шаблоны:

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

, это возвращает

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 
0
ответ дан deni 5 September 2018 в 07:23
поделиться

Вот упрощенная версия (возникла из ответа Эспо). Он проверяет правильность даты (даже високосный год) и hh: mm: ss необязательно Примеры, которые работают: - 31/12/2003 11:59:59 - 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
-1
ответ дан Duc Tran 5 September 2018 в 07:23
поделиться

http://regexlib.com/REDetails.aspx?regexp_id=610

^ (? = \ d) (? :( ?: 31 ( ?!. (? ?: 0 [2469] | 11)) | (:?!.?.?.? 30 | 29) (0 2) | 29 (= 0 2 (:( :( ?: 1 [6-9] |? [2-9] \ г) (0 ?: [48] | [2468] [048] | [13579] [26]) | (:( ?: 16 |? [2468] [048] | [3579] [26]) 00))) (?: \ x20 | $)) | (:? 2 [0-8] | 1 \ d | 0 [1-9])) ([ - /]) (?: 1 [012] | 0 [1-9]) \ 1 (:.??? 1 [6-9] | [2-9] \ г) \ д \ д (:( ? = \ х20 \ г) \ х20 | $)) (((0 [1-9] | 1 [012]) (?:? [0-5] \ г) {0,2} (\ х20 [А.П. ] M)) | ([01] \ d | 2 [0-3]) (: [0-5] \ d) {1,2})? $


Этот RE проверяет как даты, так и / или временные шаблоны. Дни в феврале также проверяются на високосные годы. Даты: в формате dd / mm / yyyy или d / m / yy между 1/1/1600 - 31/12/9999. Ведущие нули являются необязательными. Сепараторы даты могут быть либо совпадающими тире (-), либо слэшами (/), либо периодами (.) Времена: в формате часов h: MM: ss AM / PM 12 часов (12:00 AM - 11:59:59 PM) или hh : MM: ss военный формат времени (00:00:00 - 23:59:59). 12-часовой формат времени: 1) может иметь начальный ноль в течение часа. 2) Минуты и секунды являются необязательными для 12-часового формата. 3) AM или PM необходимы и чувствительны к регистру. Военное время 1) должно иметь начальный ноль за все часы менее 10. 2) Протоколы являются мандатными. 3) секунды являются необязательными. Datetimes: сочетание вышеуказанных форматов. Сначала дата, затем время, разделенное пробелом. ex) dd / mm / yyyy hh: MM: ss


Изменить: убедитесь, что вы скопируете RegEx с сайта regexlib.com, поскольку StackOverflow иногда удаляет / уничтожает специальные символы.

7
ответ дан Espo 5 September 2018 в 07:23
поделиться

PHP preg-функции требуют, чтобы ваше регулярное выражение было обернуто символом-разделителем, который может быть любым символом. Вы не можете использовать этот символ разделителя, не выходя из регулярного выражения. Это должно работать (здесь символ разделителя есть /):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

Если вам нужно сопоставить строки, содержащие только дату и время, добавьте ^ и $ в начало и конец регулярного выражения.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Ссылка на PHP-руководство preg_match ()

-1
ответ дан Imran 5 September 2018 в 07:23
поделиться
^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$
2
ответ дан Javad Yousefi 5 September 2018 в 07:23
поделиться

Вот мое решение:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u
0
ответ дан KoKo 5 September 2018 в 07:23
поделиться
$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$ будут:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

Простой способ разбить стробированную строку datetime.

3
ответ дан Philip 5 September 2018 в 07:23
поделиться

Я изменил шаблон регулярного выражения из http://regexlib.com/REDetails.aspx?regexp_id=610 . Следующий шаблон должен соответствовать вашему случаю.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

YYYY-MM-DD HH: MM: SS

0
ответ дан themepark 5 September 2018 в 07:23
поделиться

Простая версия, которая будет работать в указанном формате, но не все остальные в соответствии с @Espos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 
22
ответ дан Tom 5 September 2018 в 07:23
поделиться

Вот мое решение:

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization [/g2]

Demuggex Demo

https://regex101.com/r/lbthaT/4

-1
ответ дан Yeongjun Kim 5 September 2018 в 07:23
поделиться
Другие вопросы по тегам:

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