Почему я не должен использовать Процесс. GetCurrentProcess ().Kill () для выхода из моего приложения WinForm?

Здесь есть две вещи:

  • 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)

23
задан Brann 4 March 2009 в 09:24
поделиться

5 ответов

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

12
ответ дан Hosam Aly 29 November 2019 в 02:53
поделиться

Это - действительно хороший вопрос!

Когда-то давно (более чем десять лет назад) я записал приложение VB6, которое зависло при завершении из-за подтвержденной ошибки в WinINet OCX (или независимо от того, что это назвали), из-за конкретного сертификата, используемого на веб-сервере, с которым это говорило.

Без любого способа прийти эта ошибка я использовал TerminateProcess и для всего, что я знаю, это приложение использовалось на нескольких тысячах машин в течение нескольких лет, и я никогда не слышал ни о какой проблеме относительно этого взлома!

4
ответ дан Dan Byström 29 November 2019 в 02:53
поделиться

Во-первых, я думаю, что Вы имеете в виду Process.Kill(), не Process.TerminateProcess(). Во-вторых, уничтожение процесса просто сорвет его. Любой код очистки не выполнится, и Ваше приложение не получит шанс отменить уничтожение (например, если пользователь не сохранил данные). Если Вы довольны этим, пойдите для него.

4
ответ дан Tim Cooper 29 November 2019 в 02:53
поделиться

Следует иметь в виду что, если Вы пишете в поток файла/сети, что возможно, что Ваша запись будет неполной.

, Если Ваше приложение готово иметь дело с поврежденными данными таким образом, то нет никакой причины не сделать это. Однако, если бы можно выйти другими средствами, я рекомендовал бы это.

1
ответ дан Richard Szalay 29 November 2019 в 02:53
поделиться

Почему бы не использовать Система. Среда. Выход (интервал) ? Кажется, что Вы хотите сделать это только для сохранения кода. Мне это намного более ясно видеть, что вызов для Выхода делает и завершением работы будут более управлять, Финализаторы и Критические Финализаторы будут работать.

0
ответ дан Matt Ellis 29 November 2019 в 02:53
поделиться
Другие вопросы по тегам:

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