как совместить только 6-значное число, используя preg_match_all [duplicate]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет 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.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

18
задан Bryce Thomas 20 August 2010 в 17:40
поделиться

5 ответов

>>> 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+" ")
33
ответ дан John La Rooy 27 August 2018 в 01:49
поделиться

Вероятно, вы хотите совместить не цифру до и после строки из 5 цифр, например [^0-9]([0-9]{5})[^0-9]. Затем вы можете захватить внутреннюю группу (нужная строка).

1
ответ дан Bob 27 August 2018 в 01:49
поделиться

Без заполнения строки для начала и конца конкретного случая, как в ответе 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']
8
ответ дан Community 27 August 2018 в 01:49
поделиться

Примечание. Существует проблема с использованием \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 при захвате всех пятизначных цифр.

Приветствия

3
ответ дан igaurav 27 August 2018 в 01:49
поделиться

Вы можете попробовать

\D\d{5}\D

или, может быть,

\b\d{5}\b

Я не уверен, что python обрабатывает контуры строк и пробелы там.

Я считаю, что ^\d{5}$ не сработает для вас, так как вы, вероятно, захотите получить числа, которые находятся где-то внутри другого текста.

11
ответ дан sth 27 August 2018 в 01:49
поделиться
Другие вопросы по тегам:

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