Здесь есть две вещи:
re.findall
возвращает захваченные тексты, если шаблон регулярного выражения содержит в нем группы захвата r'\\.'
в вашем шаблон соответствует двум последовательным символам, \
и любому символу, отличному от новой строки. См. ссылку findall
:
Если одна или несколько групп присутствуют в шаблоне, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого совпадения.
blockquote>Обратите внимание, что чтобы
re.findall
возвращали только совпадающие значения, вы обычно можете
- удаляет избыточные группы захвата (например,
(a(b)c)
->abc
)- преобразует все группы захвата в , не захватывая (то есть замените
(
на(?:
) , если отсутствуют обратные ссылки, которые относятся к значениям группы в шаблоне (см. ниже)- вместо
re.finditer
использовать[x.group() for x in re.finditer(pattern, s)]
)В вашем случае
findall
вернул все захваченные тексты, которые были пустыми, потому что вы\\
в [литерале] строкиr''
, которые пытались сопоставить литерал\
.Чтобы соответствовать номерам, вам нужно использовать
-?\d*\.?\d+
Регулярное выражение соответствует:
-?
- Дополнительный знак минус\d*
- Необязательные цифры\.?
- Дополнительный десятичный разделитель\d+
- 1 или более цифр.См. demo
Вот демон IDEONE :
import re s = r'abc123d, hello 3.1415926, this is my book' pattern = r'-?\d*\.?\d+' L = re.findall(pattern, s) print(L)
Уничтожение процесса означало бы, что наконец блоки не будут выполняться, и вероятно даже критические объекты финализатора , который может на самом деле быть очень важным, и вызвать утечку ресурса на системном уровне. Это может также вызвать неожиданные ошибки в будущем, когда кто-то еще поддерживает код, поскольку они (или Вы) должны будут скрутить головы, имея необходимость думать каждый раз, когда они пишут наконец блок, будет ли это выполняться.
Это - действительно хороший вопрос!
Когда-то давно (более чем десять лет назад) я записал приложение VB6, которое зависло при завершении из-за подтвержденной ошибки в WinINet OCX (или независимо от того, что это назвали), из-за конкретного сертификата, используемого на веб-сервере, с которым это говорило.
Без любого способа прийти эта ошибка я использовал TerminateProcess и для всего, что я знаю, это приложение использовалось на нескольких тысячах машин в течение нескольких лет, и я никогда не слышал ни о какой проблеме относительно этого взлома!
Во-первых, я думаю, что Вы имеете в виду Process.Kill()
, не Process.TerminateProcess()
. Во-вторых, уничтожение процесса просто сорвет его. Любой код очистки не выполнится, и Ваше приложение не получит шанс отменить уничтожение (например, если пользователь не сохранил данные). Если Вы довольны этим, пойдите для него.
Следует иметь в виду что, если Вы пишете в поток файла/сети, что возможно, что Ваша запись будет неполной.
, Если Ваше приложение готово иметь дело с поврежденными данными таким образом, то нет никакой причины не сделать это. Однако, если бы можно выйти другими средствами, я рекомендовал бы это.
Почему бы не использовать Система. Среда. Выход (интервал) ? Кажется, что Вы хотите сделать это только для сохранения кода. Мне это намного более ясно видеть, что вызов для Выхода делает и завершением работы будут более управлять, Финализаторы и Критические Финализаторы будут работать.