2016-07-05 9 views
0

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

некоторого текст \ п {{Information \ п | region = [[Western]] \ n | image = image187a.jpg {{!}} \ n | .... \ п}} \ п некоторый текст

Что я хотел бы сделать, это извлечь только часть строки, которая включена между «{{Информация» и «}}» , также между двумя метками разделителя могут появляться другие закрывающие фигурные скобки. Я написал следующий фрагмент кода python, но он вообще не работает.

print re.split(r'^\{\{(Information) \}\}$', information.string, flags=re.MULTILINE) 

Может ли кто-нибудь мне помочь?

+0

Что-то вроде этого https: //regex101.com/r/pZ3lG8/1'^.* \ {\ {(. *)}} ' – 1252748

+0

result = re.search ('\ s * \ {\ s * \ {\ s * (Информация \ s * [^}] *) \} \} ',' YOUR INPUT STRING ') result.group (0) – Destrif

ответ

0

Это дает текст в Информационной «Tag»:

import re 
text = "some text \n {{Information \n | region = [[Western]] \n | .... \n }} \n some text" 
result = re.search(r'{{Information (.*)}}', text, flags=re.DOTALL) 
print(result.groups()[0] 
0

Вы должны использовать ленивый квантор между ограничителями, так что он может соответствовать дополнительным символам, которые охватывают несколько строк. Добавление многострочного режима делает так, чтобы ^ и $ соответствовали началу и концу той же строки. Удалите это. Полезный режим, однако, был бы точечным.

re.search('{{Information .*?}}', information.string, flags=re.DOTALL) 

Regex101 Demo

0

Я предпочитаю использовать re.search() для re.split() для этого, как вы пытаетесь найти шаблон. Вы могли бы попробовать что-то вроде этого:

import re 

some_text = 'some text \n {{Information \n | region = [[Western]] \n | .... \n }} \n some text' 

rx_match = re.search(r'{{Information(?P<info>.*?)}}', some_text, re.DOTALL) 

if rx_match is not None: 
    print rx_match.group('info') 

(?P<name>...) немного более продвинутым. Это именованная группа, и она позволяет вам выбирать информацию по имени. Более простой способ сделать это было бы:

rx_match = re.search(r'{{Information(.*?)}}', some_text, re.DOTALL) 

if rx_match is not None: 
    print rx_match.group(1) 

Для регулярного выражения, то { не нужно экранировать. [^}]+ - отрицательный набор символов. (^ инвертирует символы в соответствии). Он говорит, чтобы соответствовать одному или нескольким символам, которые не являются }.

Вам необходимо будет подтвердить, что матч прошел успешно. Если да, то вы можете использовать метод .group() для извлечения данных для групп ().

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

+0

Причина '{{' и '}}' используется как разделители потому что он имеет низкую вероятность быть нужным в пределах содержащейся строки. Если вы используете '[^}] +' для захвата до разделителя, это не сработает, если строка содержит какие-то отдельные фигурные скобки. Например. это не сработает '{{Информационный тест = {hi} region = [[Western]]}}' – 4castle

+0

Я заметил, что моя строка может содержать закрывающие фигурные скобки внутри двух тегов разделителей (например, в примере @ 4castle). –

+0

Хорошо.Зная это, вам нужно будет изменить регулярное выражение. Я бы сделал два изменения. Во-первых, я бы добавил 're.DOTALL' (также называемый' re.S'), потому что у вас есть новые строки, которые разделяют шаблон. Кроме того, кто-то упомянул ленивых квантификаторов. Я не думаю, что это имеет значение для текста, который вы указали, но это должно быть полезно. Итак, я редактирую регулярное выражение из 're.search (r '{{(? P [^}] +)}}', some_text)' to 're.search (r '{{Information (? P . *?)}} ', some_text, re.DOTALL) ' – DKing

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