Если вы пытаетесь для понимания регулярных выражений, а не просто для того, чтобы получить значение из строки, вы можете найти это полезным.
Первое, что вам нужно, это группировка. Скобки в регулярном выражении ограничивают группу; re.match()
имеет метод groups()
, который возвращает кортеж текста, сопоставляемый группами в шаблоне. Например:
>>> re.match('foo(bar)baz', 'foobarbaz').groups()
('bar',)
Так что в вашем случае, вы можете создать шаблон, который совпадающий текст до толстой кишки, а затем группа, которая соответствовала текст, который Вы искали. И здесь мы переходим ко второй части проблемы: какие шаблоны вы должны искать? Например, эта модель определенно работает:
The final score is: (25).
Но это не исключительно полезно, так как он будет возвращать только матч (и 25
в первой группе), если строка вы совпадающая The final score is: 25.
. Он не будет соответствовать любой другой строке.
Когда вы составляете регулярное выражение, задаваемый вами вопрос: «Какие части входной строки могут измениться и как?» Это говорит вам, какие шаблоны писать.
Например, если ваш источник всегда содержит один и тот же двоеточие, первая часть вашего шаблона может быть [^:]*:
.Вы определяете класс символов, который есть все, кроме двоеточия ([^:]
), говоря, что вы хотите совместить его с ноль или более раз (*
), а затем заявив, что хотите совместить двоеточие (:
).
Если вы знаете, что ваш источник всегда заканчивается с периодом, вы можете сформулировать шаблон, используемый для группы таким же образом: «соответствовать каждому символу, который не период», или [^.]*
. И вы в итоге получите следующее:
s = 'The final score is: 25.'
>>> re.match(r'[^:]*:([^.]*)', s).groups()
(' 25',)
Это сломается, если значение, которое вы пытаетесь захватить, содержит период. Для шаблона, который захватывает все, кроме термина , период, вы можете определить свою группу как ([\$]*)
(с использованием метасимвола конца строки $
таким образом означает, что вы хотите, чтобы соответствовать нулевому или более оставшимся символам в этой строке), а затем .$
. Терминал .$
означает, что для соответствия шаблону он должен соответствовать периоду в конце строки. Группа захватывает столько символов, сколько может, вплоть до момента, когда схватка больше не приведет к тому, что шаблон не будет соответствовать.
Это означает, что это работает:
>>> s = "The final score is: this.is.something.different."
>>> re.match(r'[^:]*:([^\$]*).$', s).groups()
(' this.is.something.different',)
Хорошо, теперь давайте посмотрим на другой возможный подход. Предположим, что мы ничего не знаем о вводе, за исключением того, что будет двоеточие, а затем где-то после этого число, которое может быть или не быть в конце строки. В этом случае наша группа захвата, очевидно, будет ([\d]*)
, которая захватывает все цифры, которые она находит. Но как мы формулируем шаблон, который правильно соответствует самому широкому диапазону возможных входных данных? Например:
>>> s = '9. The answer is: 25 or thereabouts.'
>>> re.match(r'[^:]*[^\d]*([\d]*)', s).groups()
('25',)
Слева направо этот шаблон говорит: во-первых, сопоставить все, что не является двоеточием. Затем, как только вы нажмете двоеточие, сопоставьте все, что не является цифрой. Затем возьмите все цифры.
Надеюсь, что это поможет. Я все еще пытаюсь самостоятельно изучить регулярные выражения, поэтому я затрудняюсь написать ответ так подробно.
Если это домашнее задание, добавьте тег [домашняя работа]. –
хорошо, это больше похоже на учебу, так как я не представляю это. Я создаю мини-проекты, чтобы, надеюсь, выучить язык более – Lilz