2009-10-24 3 views
0

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

Благодаря

+0

Если это домашнее задание, добавьте тег [домашняя работа]. –

+0

хорошо, это больше похоже на учебу, так как я не представляю это. Я создаю мини-проекты, чтобы, надеюсь, выучить язык более – Lilz

ответ

-1

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

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

>>> s.split(":")[-1].strip() #use -1 to always get the last element 
'25' 
+3

, и если итоговый счет 125? – foosion

+0

затем используйте метод split. ничего невозможного сделать. – ghostdog74

3

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

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

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

+0

В данном укусе есть точка в конце. Так что это должно быть оценка = s.split (':') [1] .strip() [: - 1] –

+0

Хорошая добыча, я не заметил точку. – Bartek

2

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

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

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

matcher = r'something:(something).' 

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

вас есть правила RE под конкретные буквы «T», «ч», «е» и т.д.

вас есть правила RE, чтобы соответствовать цифры «\ д»

2

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

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

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

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

Смежные вопросы