Свести совпадения с регулярными выражениями - PullRequest
0 голосов
/ 12 октября 2019

Сводка

Я создал регулярное выражение, которое будет извлекать несколько различных данных из HTML-страницы. Он использует сгруппированные альтернативы в группе без захвата. Это работает очень хорошо, чтобы получить необходимые данные;тем не менее, группы не объединяются в как можно меньшее количество совпадений тестер

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

Похоже, мои единственные решения: ...

  1. Переписать регулярное выражение, чтобы в каждом совпадении было 5 сопоставленных групп
  2. Напишите код на языке Python, чтобы сгладить структуру данных.
  3. Что-то еще ???

Номер 1, представленный выше, был бы лучше из идей. Я не хочу «загрязнять» свою кодовую базу ненужным кодом

Код

Regex

^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:\.tar\.gz|.zip))\">(.*)</a>.*\((.*) bytes\))

Детская площадка https://regex101.com/r/MC8TOv/1/

Веб-сайт https://android -dot-devsite-v2-prod.appspot.com / studio / archive_25350a46834ddb86754aba2445ff1359aa7fd8cb296923255092494ac94ef531.frame

*1035***

Python

При использовании BeautifulSoup

import re

...

regex = r"^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:.tar.gz|.zip))\">(?P<filename>.*)</a>.*\((.*) bytes\))"          
match = re.findall(regex, str(soup_html), re.M)

print(match)

Ожидания

Что я получаю Это какой-то общийвывод, который я получаю.

 [
     ('A1', '', '', '', ''),
     ('', 'B1', '', '', ''),
     ('', '', 'C1', 'D1', 'E1'),
     ('A2', '', '', '', ''),
     ('', 'B2', '', '', ''),
     ('', '', 'C2', 'D2', 'E2'),
     ...
 ]

Что я хочу

 [
     ('A1', 'B1', 'C1', 'D1', 'E1'),
     ('A2', 'B2', 'C2', 'D2', 'E2')
     ...
 ]

Опять же, есть ли способ переписать регулярное выражение, чтобы в каждом совпадении было 5 сопоставленных групп?

1 Ответ

0 голосов
/ 12 октября 2019

Если пять вещей должны появиться в последовательности, как предлагает ваш пример, объедините их с .*? вместо |:

(regex1).*?(regex2).*?(regex3).*(regex4).*?(regex5)

вместо

(regex1)|(regex2)|(regex3).*(regex4).*?(regex5)

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

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

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