По вопросу «что мне делать с этим» может быть много ответов.
Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .
Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.
Таким образом, вы можете избежать случаев NullReferenceException
, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X
в классе, а затем попытаетесь вызвать один из его методов, а X
имеет нулевое значение, то это приведет к NullReferenceException
:
public X { get; set; }
public void InvokeX()
{
X.DoSomething(); // if X value is null, you will get a NullReferenceException
}
Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:
//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant ()
{
Contract.Invariant ( X != null );
//...
}
По этой причине Код Контракт существует для приложений .NET.
В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .
ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .
>>> import re
>>> s="four digits 1234 five digits 56789 six digits 012345"
>>> re.findall(r"\D(\d{5})\D", s)
['56789']
, если они могут произойти в самом начале или в самом конце, проще вставить строку, чем беспорядок со специальными случаями
>>> re.findall(r"\D(\d{5})\D", " "+s+" ")
Вероятно, вы хотите совместить не цифру до и после строки из 5 цифр, например [^0-9]([0-9]{5})[^0-9]
. Затем вы можете захватить внутреннюю группу (нужная строка).
Без заполнения строки для начала и конца конкретного случая, как в ответе John La Rooy , можно использовать негативы lookahead и lookbehind для обработки обоих случаев с одним регулярным выражением
>>> import re
>>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
>>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
['88888', '12345', '98765']
Примечание. Существует проблема с использованием \D
, поскольку \D
соответствует любому символу, который не является цифрой, вместо этого используйте \b
. \b
важен здесь, потому что он соответствует границе слова, но только в конце или в начале слова.
import re
input = "four digits 1234 five digits 56789 six digits 01234,56789,01234"
re.findall(r"\b\d{5}\b", input)
result : ['56789', '01234', '56789', '01234']
, но если вы используете re.findall (r "\ D (\ d {5}) \ D", s) вывод: ['56789', '01234'] \ D не может для обработки запятой или любых введенных цифр.
\ b является важной частью здесь, она соответствует пустой строке, но только в конце или в начале слова.
Дополнительная документация: https://docs.python.org/2/library/re.html
Подробнее Разъяснение использования \D
vs \b
:
В этом примере используется \D
, но он не фиксирует все пять цифр.
В этом примере использует \b
при захвате всех пятизначных цифр.
Приветствия
Вы можете попробовать
\D\d{5}\D
или, может быть,
\b\d{5}\b
Я не уверен, что python обрабатывает контуры строк и пробелы там.
Я считаю, что ^\d{5}$
не сработает для вас, так как вы, вероятно, захотите получить числа, которые находятся где-то внутри другого текста.