Это можно сделать, используя 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)
@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;
Другие языки будут иметь схожие возможности. Обратите внимание, что для регулярного выражения вам нужно будет сделать некоторые незначительные моды, если вы хотите принимать такие значения, как однозначные месяцы.
Вы должны найти то, что ищете в http://regexlib.com/DisplayPatterns.aspx?cattabindex=4&categoryId=5 .
относительно ответа Имрана с 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 )
Вот упрощенная версия (возникла из ответа Эспо). Он проверяет правильность даты (даже високосный год) и 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})?$
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})? $
blockquote>
Этот 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
blockquote>
Изменить: убедитесь, что вы скопируете RegEx с сайта regexlib.com, поскольку StackOverflow иногда удаляет / уничтожает специальные символы.
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');
^([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[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
$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.
Я изменил шаблон регулярного выражения из 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
Простая версия, которая будет работать в указанном формате, но не все остальные в соответствии с @Espos:
(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})
Вот мое решение:
[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
[/g2]