HOWTO разобрать текстовый файл для строк, содержащих выражения вида VARIABLE = SOMEVALUE

1

У меня есть текстовый файл (фактически,.xml), который содержит определенные строки формы MACAddress=SOMEVALUE, и смешивается в других строках. Например, типичная такая строка (в одной строке):

<Adapter slot="3" enabled="false" MACAddress="080027671C79" cable="true" speed="0" type="Am79C973">

N.B. В приведенной выше строке SOMEVALUE точно "080027671C79".

Итак, я хотел бы проанализировать файл и собрать все SOMEVALUES. Как я могу это сделать в python (re?, Find?)?

Спасибо заранее.

Теги:
parsing

3 ответа

4

Это XML, поэтому используйте синтаксический анализатор XML. Например:

from xml.dom.minidom import parse

macs = [adapter.getAttribute("MACAddress") for adapter in
        parse("file.xml").getElementsByTagName("Adapter")]
0

Регулярное выражение будет более быстрым.

Один из Арциомов слишком строгий, я думаю. Я бы сделал:

from re import findall
findall('MACAddress=([^ \t]+)', text)

Но я думаю, вы хотите, что есть МЕЖДУ кавычками ". Затем:

from re import findall
findall('MACAddress="([^"]+)"', text)

.

Возможно ли, что SOMEVALUE, который вы хотите уловить, содержит кавычки "?

0

Не уверен, что я правильно знаю, что такое MAC-адрес, но, пожалуйста, отметьте еще два варианта ниже:

Input:

text = """
Adapter slot="3" enabled="false" Mcable="true" speed="0" type="Am79C973">
Adapter slot="3" enabled="false" MACAddress="080027671C79" cable="true" speed="0" type="Am79C973">
Adapter slot="3" enabled="false" MACAddress="080027671C71" cable="true" speed="2" type="Am79C973">
Adapter slot="3" enabled="false" MACAddress="080024671C79" cable="true" speed="1" type="Am79C973">
Adapter slot="3" enabled="false" MACAddress="080227671C79" cable="true" speed="1" type="Am79C973">
"""

1) RegEx:

from re import findall
findall(r'(?i)(?<=MACAddress=\")\w{12}', text)

2) Нарезка строк:

searchTxt = 'MACAddress="'
searchLen = len(searchTxt)
getMAC = lambda line: line[line.index(searchTxt) + searchLen: line.index(searchTxt) + searchLen + 12]
map(lambda line: getMAC(line), (line for line in text.split() if searchTxt in line))
  • 0
    @Artsiom Rudzenka Что (? I) часть, пожалуйста?
  • 0
    @eyquem - игнорировать регистр - например, регистр не имеет значения
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню