Regex - мне нужно найти что-то, а затем скопировать то, что после этого - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть что-то вроде этого:

<A NAME=speech26><b>SIR HUGH EVANS</b></a>
<blockquote>
<A NAME=1.1.58>Shall I tell you a lie? I do despise a liar as I do</A><br>
<A NAME=1.1.59>despise one that is false, or as I despise one that</A><br>
<A NAME=1.1.60>is not true. The knight, Sir John, is there; and, I</A><br>
<A NAME=1.1.61>beseech you, be ruled by your well-willers. I will</A><br>
<A NAME=1.1.62>peat the door for Master Page.</A><br>
<p><i>Knocks</i></p>
<A NAME=1.1.63>What, hoa! Got pless your house here!</A><br>
</blockquote>

Я хочу найти весь текст и вывести его на что-то вроде этого

Shall I tell you a lie? I do despise a liar as I do
despise one that is false, or as I despise one that
is not true. The knight, Sir John, is there; and, I
beseech you, be ruled by your well-willers. I will
peat the door for Master Page.
What, hoa! Got pless your house here!

Я пытался <A NAME=[0-9]+\\.[0-9]+\\.[0-9]+>, но этоне работает, а также не достигает того, что я хочу сделать.Может кто-нибудь помочь?

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Синтаксический анализ HTML / XML / JSON с помощью регулярных выражений - это все равно что писать код плохого качества.HTML может содержать повторяющиеся вложенные структуры, которые могут привести к неожиданным результатам при синтаксическом анализе с помощью регулярного выражения.

Вы можете использовать библиотеку Beautiful Soup в python и анализировать данный HTML-код для извлечения желаемого результата.

Вотпример кода Python с использованием Beautiful Soup

import re
from bs4 import BeautifulSoup

data = """<A NAME=speech26><b>SIR HUGH EVANS</b>
</a><blockquote>
<A NAME=1.1.58>Shall I tell you a lie? I do despise a liar as I do</A><br>
<A NAME=1.1.59>despise one that is false, or as I despise one that</A><br>
<A NAME=1.1.60>is not true. The knight, Sir John, is there; and, I</A><br>
<A NAME=1.1.61>beseech you, be ruled by your well-willers. I will</A><br>
<A NAME=1.1.62>peat the door for Master Page.</A><br>
<p><i>Knocks</i></p>
<A NAME=1.1.63>What, hoa! Got pless your house here!</A><br>
</blockquote>"""

soup = BeautifulSoup(data)

for aTag in soup.find_all('a', {'name': re.compile(r'\d+\.\d+\.\d+')}):
 print(aTag.get_text())

, который дает следующий вывод по мере необходимости,

Shall I tell you a lie? I do despise a liar as I do
despise one that is false, or as I despise one that
is not true. The knight, Sir John, is there; and, I
beseech you, be ruled by your well-willers. I will
peat the door for Master Page.
What, hoa! Got pless your house here!

Обратите внимание, я также использовал здесь регулярное выражение, но в ограниченном пространстве, просто чтобы сказать, что меня интересуют все теги 'a', где значение атрибута name соответствует этому шаблону \d+\.\d+\.\d+.

0 голосов
/ 10 декабря 2018

Вы можете попробовать это

<A NAME=\d+\.\d+\.\d+>(.*)(?=</A>)

Пояснение

  • <A NAME=\d+\.\d+\.\d+> - будет соответствовать что-то вроде этого <A NAME=1.1.112>
  • (.*) - Совпадение с чем угодно, кроме нуля или новой строки.
  • (?=</A>) - Позитивный взгляд в будущее.Матчи </A>.

Демо

0 голосов
/ 10 декабря 2018

Вы можете попробовать код ниже.

text = """<A NAME=speech26><b>SIR HUGH EVANS</b>
</a><blockquote>
<A NAME=1.1.58>Shall I tell you a lie? I do despise a liar as I do</A><br>
<A NAME=1.1.59>despise one that is false, or as I despise one that</A><br>
<A NAME=1.1.60>is not true. The knight, Sir John, is there; and, I</A><br>
<A NAME=1.1.61>beseech you, be ruled by your well-willers. I will</A><br>
<A NAME=1.1.62>peat the door for Master Page.</A><br>
<p><i>Knocks</i></p>
<A NAME=1.1.63>What, hoa! Got pless your house here!</A><br>
</blockquote>"""

output = re.findall(r'<A NAME=\d\.\d\.\d*>(.*?)(?=</A>)', text, re.MULTILINE|re.DOTALL)
print(output)

Выход

['Shall I tell you a lie? I do despise a liar as I do', 'despise one that is false, or as I despise one that', 'is not true. The knight, Sir John, is there; and, I', 'beseech you, be ruled by your well-willers. I will', 'peat the door for Master Page.', 'What, hoa! Got pless your house here!']
0 голосов
/ 10 декабря 2018

Вот один из вариантов, используя re.findall:

text = "<A NAME=1.1.58>Shall I tell you a lie? " # ... your input from above
output = re.findall(r'<A NAME=\d+\.\d+\.\d+>(.*?)(?=</A>)', text, re.MULTILINE|re.DOTALL)
print(output)

['Shall I tell you a lie? I do despise a liar as I do',
 'despise one that is false, or as I despise one that',
 'is not true. The knight, Sir John, is there; and, I',
 'beseech you, be ruled by your well-willers. I will',
 'peat the door for Master Page.',
 'What, hoa! Got pless your house here!']

Но учтите, что в целом использование регулярных выражений для разбора содержимого HTML / XML не очень хорошая вещь.Если вы уверены, что ваш целевой контент будет когда-либо встречаться только между типами <A> тегов, которые вы показывали выше, то вам может сойти с рук использование регулярного выражения.

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