s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)
Вам не нужно escape
дважды, когда вы используете raw mode
.
Выход: ['123', '3.1415926']
Также тип возврата будет списком strings
.Если вы хотите, чтобы возвращаемый тип, как integers
и floats
, использовал map
import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))
Выход: [123, 3.1415926]
Jarret Hardie уже упомянул это : Согласно Guido van Rossum , на данный момент нет никакого лучшего пути: Как указано в документация , join(None)
блоки (и это не означает сигналов). Альтернатива - звонящий с огромным тайм-аутом (join(2**31)
или так) и проверяющий isAlive
большие взгляды. Однако способ, которым Python обрабатывает таймеры, имеет катастрофические последствия, как замечено при выполнении тестовой программы Python с servth.join(100)
вместо servth.join()
:
select(0, NULL, NULL, NULL, {0, 1000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 2000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 4000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 8000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 16000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 32000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
--- Skipped 15 equal lines ---
select(0, NULL, NULL, NULL, {0, 50000}Killing
Т.е. Python будит каждые 50 мс, ведя к единственному приложению, мешающему ЦП спать.
Потоки в Python являются несколько странными зверями, учитывая глобальную блокировку интерпретатора. Вы не можете быть в состоянии достигнуть того, что Вы хотите, не обращаясь к тайм-ауту соединения и isAlive, как eliben предполагает.
существует два места в документах, которые приводят причину для этого (и возможно больше).
первое:
От http://docs.python.org/library/signal.html#module-signal :
Некоторую заботу нужно соблюдать, если и сигналы и потоки используются в той же программе. Фундаментальная вещь помнить в использовании сигналов и потоков одновременно: всегда выполняйте сигнал () операции в основном потоке выполнения. Любой поток может выполнить предупреждение (), getsignal (), пауза (), setitimer () или getitimer (); только основной поток может установить новый обработчик сигналов, и основной поток будет единственным для получения сигналов (это осуществляется модулем сигнала Python, даже если базовая поддержка внедрения потока, отправляющая сигналы в отдельные потоки). Это означает что сигналы can’t использоваться в качестве средства сообщения межпотока. Используйте блокировки вместо этого.
второе, от http://docs.python.org/library/thread.html#module-thread :
Потоки взаимодействуют странно с прерываниями: исключение KeyboardInterrupt будет получено произвольным потоком. (Когда модуль сигнала доступен, прерывания всегда переходят к основному потоку.)
РЕДАКТИРОВАНИЕ: было достойное обсуждение механики этого на средстве отслеживания ошибки Python здесь: http://bugs.python.org/issue1167930 . Конечно, это заканчивается Guido, говорящим: "Это вряд ли уйдет, таким образом, необходимо будет просто жить с этим. Поскольку Вы обнаружили, определив, что тайм-аут решает проблему (вид)". YMMV:-)
Опрос на isAlive
прежде, чем звонить join
. Этот опрос может быть прерван, конечно, и как только поток не isAlive
, join
непосредственно.
альтернатива опросила бы на join
с тайм-аутом, сверившись isAlive
, произошел ли тайм-аут. Это может потратить меньше ЦП, чем предыдущий метод.