2012-10-15 3 views
0

У меня есть XML-фрагмент, как:регулярного выражения для атрибутов словаря

<CharacterBlock MinVal="-10.000000" MaxVal="15.000000" Active="1"> 

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

Я написал следующий Python регулярное выражение:

re.compile('<CharacterBlock MinVal="(?P<MinVal>-?[0-9]*\.?[0-9]*)" MaxVal="(?P<MaxVal>-?[0-9]*\.?[0-9]*)" .*?>', re.DOTALL) 

, который работает на фрагменте кода выше. Но так как атрибуты XML, как словарь, их порядок не гарантируется, а иногда я получаю сниппет как:

<CharacterBlock Active="0" MaxVal="-15.000000" MinVal="-100.000000"> 

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

+0

Используйте XML-парсер. – kindall

+0

Как я уже сказал в своем вопросе, из-за ограничений среды, в которой я работаю, я не могу использовать парсер XML и вынужден использовать регулярное выражение. – BioGeek

+1

Используйте один * в любом случае. * Если один из них не установлен, вы можете установить его рядом со своим скриптом (или даже включить его в свой скрипт, если по какой-то причине у вас может быть только один файл). Если парсер DOM использует слишком много памяти, используйте парсер SAX. – kindall

ответ

1

Вы можете получить два значения отдельно? как:

In [2]: s='<CharacterBlock Active="0" MaxVal="-15.000000" MinVal="-100.000000">' 
In [3]: import re 
In [4]: manReg='(?<=MaxVal=")[^"]*' 
In [5]: minReg='(?<=MinVal=")[^"]*' 

In [6]: re.findall(minReg, s) 
Out[7]: ['-100.000000'] 

In [8]: re.findall(maxReg, s) 
Out[9]: ['-15.000000'] 
1

Поскольку приказ не фиксируется и есть другие поля, кажется, вам лучше всего использовать два регулярных выражения, один для MAXVAL и другой для MINVAL.

0

что-то вроде:

for xmltag in re.finditer(r'<CharacterBlock.*?>', s): 
    ismin = re.search(r'\bMinVal=["\'](.*?)[\'"]', xmltag.group(0)) 
    if ismin: 
     min=ismin.group(1) 
    ismax= re.search(r'\bMaxVal=["\'](.*?)[\'"]', xmltag.group(0)) 
    if ismax: 
     max=ismax.group(1) 
    if ismin and ismax: 
     print "Min: %s, Max %s" % (min, max) 
Смежные вопросы