Если вы пытаетесь понять регулярные выражения, а не просто пытаетесь получить значение из строки, это может оказаться полезным.
Первое, что вам нужно - это группировка. Круглые скобки в регулярном выражении разграничивают группу; re.match()
имеет метод groups()
, который возвращает кортеж текста, соответствующего группам в шаблоне. Например:
>>> re.match('foo(bar)baz', 'foobarbaz').groups()
('bar',)
Итак, в вашем случае вы должны создать шаблон, который соответствует тексту до двоеточия, а затем группу, которая соответствует тексту, который вы ищете. И здесь мы переходим ко второй части проблемы: какие шаблоны вы должны искать? Например, этот шаблон определенно будет работать:
The final score is: (25).
Но это не исключительно полезно, так как оно будет возвращать совпадение (и 25
в первой группе), если соответствующая строка The final score is: 25.
. Это не будет соответствовать любой другой строке.
Когда вы составляете регулярное выражение, вы задаете себе вопрос: «Какие части входной строки могут измениться и как?» Это говорит вам о том, какие шаблоны писать.
Например, если ваш источник всегда содержит одно и только одно двоеточие, первая часть вашего шаблона может быть [^:]*:
. Вы определяете класс символов - это все, кроме двоеточия ([^:]
), говорите, что хотите соответствовать ему ноль или более раз (*
), а затем говорите, что хотите сопоставить двоеточие (* 1020). *). * * тысяча двадцать-один
Если вы знаете, что ваш источник всегда оканчивается точкой, вы можете сформулировать шаблон, используемый для группы, таким же образом: «соответствовать каждому символу, который не является точкой», или [^.]*
. И вы закончите с этим:
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',)
Слева направо, этот шаблон говорит: во-первых, сопоставьте все, что не является двоеточием. Затем, как только вы нажмете на двоеточие, сопоставьте все, что не цифра. Затем возьмите все цифры.
Надеюсь, это поможет. Я все еще пытаюсь выучить регулярные выражения самостоятельно, поэтому я пытаюсь написать такой подробный ответ.