регулярное выражение в питоне - PullRequest
0 голосов
/ 24 октября 2009

Извините, если этот вопрос слишком прост, но я не могу объяснить это. Я хочу разобрать строку. Я хочу извлечь слова между «Окончательный счет:» и «.». Другими словами, если у меня есть строка «Конечная оценка: 25.» Я хочу извлечь 25. Я не знаю, как это сделать. Должен ли я использовать матч? или разделить ??

Спасибо

Ответы [ 4 ]

3 голосов
/ 24 октября 2009

Если вы знаете, что ваша информация всегда будет отформатирована таким образом, вы можете просто использовать split:

s = "The final score is: 25"
score = s.split(':')[1].strip()

Результатом будет 25. Я использую .strip () в конце, чтобы удалить любые пробелы в качестве меры безопасности.

2 голосов
/ 25 октября 2009

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

Первое, что вам нужно - это группировка. Круглые скобки в регулярном выражении разграничивают группу; 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',)

Слева направо, этот шаблон говорит: во-первых, сопоставьте все, что не является двоеточием. Затем, как только вы нажмете на двоеточие, сопоставьте все, что не цифра. Затем возьмите все цифры.

Надеюсь, это поможет. Я все еще пытаюсь выучить регулярные выражения самостоятельно, поэтому я пытаюсь написать такой подробный ответ.

2 голосов
/ 24 октября 2009

Вы говорите о "захвате" некоторых символов между "Окончательный счет:" и ".". Это означает, что у вас есть группа. Группа требует () 's.

См. http://docs.python.org/library/re.html для всех правил.

Так как это пахнет домашней работой, я не буду все предоставлять. RE будет иметь форму

matcher = r'something:(something).'

Группа определения (), которая сохраняется в объекте сопоставления и может быть получена.

У вас есть правила RE, соответствующие буквам «T», «h», «e» и т. Д.

У вас есть правила RE, соответствующие цифрам '\ d'

0 голосов
/ 24 октября 2009

вам не нужно регулярное выражение для этого ... выполните разбиение на ":", затем получите последний элемент ИЛИ, просто используйте нарезку строк

>>> "The final score is: 25."[-3:-1]
'25'

>>> s.split(":")[-1].strip()  #use -1 to always get the last element
'25'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...