Жадный и ленивый квантификатор. Тестирование с тегами HTML - PullRequest
0 голосов
/ 26 марта 2020

Ввод

<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p>

Ожидаемый первый выход (как я использую жадный квантификатор)

<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p>

Код, используемый для Жадность, как показано ниже

text = '''
<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p>
'''
pattern=re.compile(r'\<p\>.*\<\/p\>')
data1=pattern.match(text,re.MULTILINE)
print('data1:- ',data1,'\n')

Ожидаемый второй результат - (как я использую квантификатор Lazy)

<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>

Код, используемый для ленивых, - как показано ниже

1 Ответ

0 голосов
/ 26 марта 2020

У вас есть пара вопросов. Во-первых, при использовании Pattern.match второй и третий параметры являются позиционными, а не флагами. Флаги должны быть указаны в re.compile. Во-вторых, вы должны использовать re.DOTALL, чтобы . соответствовал символу новой строки, а не re.MULTILINE. Наконец - match настаивает на том, что совпадение происходит в начале строки (что в вашем случае является символом новой строки), поэтому оно не будет совпадать. Вы можете вместо этого использовать Pattern.search. Это будет работать для вашего примера ввода:

pattern=re.compile(r'<p>.*</p>', re.DOTALL)
data1=pattern.search(text)
print('data1:- ',data1.group(0),'\n')

Вывод:

data1:-  <p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p> 

Одиночное совпадение:

pattern=re.compile(r'<p>.*?</p>', re.DOTALL)
data1=pattern.search(text)
print('data1:- ',data1.group(0),'\n')

Вывод:

data1:-  <p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p> 

Обратите внимание также, что /, < и > не имеют специального значения в регулярных выражениях и не требуют экранирования. Я удалил это в моем коде выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...