Обновление
Я бы порекомендовал версию ElementTree внизу. Но вот версия регулярного выражения в соответствии с запросом:
import re
txt = """
<AdaptationSet segmentAlignment="true" maxWidth="1280" maxHeight="720" maxFrameRate="24" par="16:9">
<Representation id="1"
mimeType="video/mp4"
codecs="avc1.4d401f"
width="512"
height="288"
frameRate="24"
sar="1:1"
startWithSAP="1"
bandwidth="1000000">
<SegmentTemplate timescale="12288" duration="61440" media="BBB_512_640K_video_$Number$.mp4" startNumber="1" initialization="BBB_512_640K_video_init.mp4" />
</Representation>
<Representation id="2" mimeType="video/mp4" codecs="avc1.4d401f" width="512" height="288" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="2000000">
<SegmentTemplate timescale="12288" duration="61440" media="BBB_512_640K_video_$Number$.mp4" startNumber="1" initialization="BBB_512_640K_video_init.mp4" />
</Representation>
<Representation id="3" mimeType="video/mp4" codecs="avc1.4d401f" width="768" height="432" frameRate="24" sar="1:1" startWithSAP="1" bandwidth="4000000">
<SegmentTemplate timescale="12288" duration="61440" media="BBB_768_1440K_video_$Number$.mp4" startNumber="1" initialization="BBB_768_1440K_video_init.mp4" />
</Representation>
</AdaptationSet>
"""
input=2000000
reps = re.findall(r'<\s*representation(?:\s*\w+="[^"]*")*\s*>.*?<\/\s*representation\s*>',
txt, flags=re.IGNORECASE + re.DOTALL)
for rep in reps:
bandwidth = int(re.search(r'bandwidth="([^"]*)"', rep, flags=re.IGNORECASE).group(1))
if (bandwidth > input):
print(rep)
Я думаю, что это проще сделать за пару шагов:
Разделить на Representation
одним. Приведенное выше регулярное выражение делает это, но вы, вероятно, могли бы заменить часть соответствия атрибутов (часть в группе без захвата (?:\s*\w+="[^"]*")*\s*>
) на что-то более простое, например [^>]*?>
, так как вам просто нужен весь элемент представления и его дочерние элементы. Чтобы разбить полное регулярное выражение:
<\s*
- соответствует <
, за которым следуют 0 или более пробелов representation
- очевидно, representation
. Флаг IGNORECASE
гарантирует, что это соответствует вариациям регистра (?:\s*\w+="[^"]*")*
- это соответствует нулю или более атрибутов формы blab_blah="value123"
, включая пробелы вокруг них. (?:
означает, что это группа без захвата, поэтому впоследствии она недоступна для метода python group()
. Это просто ради повторения, ie, ноль или более атрибутов или (?:...)*
. Опять же, поскольку здесь вам не нужно соответствие атрибутов, это можно упростить до чего-то вроде [^>]*?>
, но это работает для меня. \s*>
- пробелы, за которыми следует >
.*?
- куча содержимого внутри элемента (включая символы новой строки из-за флага DOTALL
), но с анти-жадным соответствием, поэтому мы обязательно останавливаемся на первом встречающемся закрывающем теге и не сопоставляемся с последующим . <\/\s*representation\s*>
- закрывающий тег с необязательным пробелом
Как только у нас есть каждый элемент «представления», мы можем вывести полосу пропускания в первый класс python целое число, чтобы его было легче сравнивать с входным
- Фильтром на основе значения пропускной способности.
Я думаю, что легче вывести пропускную способность в целое число и сравнить его с входными данными, чем пытаться выполнить целочисленное сравнение внутри самого регулярного выражения.
Также обратите внимание, что если нет (или более 1) экземпляров атрибута пропускной способности, код не не справиться с этим. Возможно, есть и другие хрупкие аспекты ...
А вот версия, использующая ElementTree. Причина, по которой это в целом лучше, заключается в том, что вы не зависите от своей собственной способности анализировать подробности всех возможных комбинаций XML грамматики. Использование библиотеки означает, что они уже продумали все эти вещи, и все, что вам нужно сопоставить, это маленькие кусочки, такие как имена элементов и атрибутов, поэтому вероятность того, что код сломается, будет меньше. Но, может быть, это домашнее задание или что-то в этом роде ...
import xml.etree.ElementTree as ET
input = 4000
tree = ET.parse('content.xml')
root = tree.getroot()
nodes = [n for n in root.findall('Representation') if int(n.attrib['bandwidth']) >= input]
print(nodes)