Используйте Rexeg, чтобы найти конкретную строку и между кавычками - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь разобрать строки, которые выглядят так.

<Report Type="Final Report" SiteName="Get Dataset" Name="Get Metadata" Description="Get Metadata" From="2019-01-16 00:00" Thru="2019-01-16 23:59" obj_device="479999" locations="69,31,">
  <Objective Type="Availability">
    <Goal>99.99</Goal>
    <Actual>100.00</Actual>
    <Compliant>Yes</Compliant>
    <Errors>0</Errors>
    <Checks>2880</Checks>
    </Objective>
  <Objective Type="Uptime">
    <Goal/>
    <Actual/>
    <Compliant/>
    <Errors>0</Errors>
    <Checks>0</Checks>
  </Objective>

Я хочу использовать регулярное выражение, чтобы найти позицию 'Description', а затем строку между кавычками, поэтому я хочу 'Get Metadata'. Затем я хочу найти позицию «От» и получить строку между кавычками, поэтому я хочу это '2019-01-16 00:00'. Наконец, я хочу найти позицию 'Thru' и получить строку между кавычками, поэтому я хочу это '2019-01-16 23:59'. Как я могу сделать это с 3 отдельными командами регулярных выражений и разбить это на 3 отдельные строки? ТИА.

Ответы [ 5 ]

0 голосов
/ 17 января 2019

В чистом питоне это должно быть примерно так:

xml = '<Report Type="Final Report" SiteName="Get Dataset" Name="Get Metadata" Description="Get Metadata" From="2019-01-16 00:00" Thru="2019-01-16 23:59" obj_device="479999" locations="69,31,"><Objective Type="Availability"><Goal>99.99</Goal><Actual>100.00</Actual><Compliant>Yes</Compliant><Errors>0</Errors><Checks>2880</Checks></Objective><Objective Type="Uptime"><Goal/><Actual/><Compliant/><Errors>0</Errors><Checks>0</Checks></Objective>'
report = xml.split('>')[0]
description = report.split("Description=\"")[1].split("\" From=\"")[0]
from_ = report.split("From=\"")[1].split("\" Thru=\"")[0]
thru = report.split("Thru=\"")[1].split("\" obj_device=\"")[0]
0 голосов
/ 17 января 2019

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

Description="([^"]*)"
From="([^"]*)"
Thru="([^"]*)"

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

import re

def getValue(str, key):
 m = re.search(key + '="([^"]*)"',str)
 if m:
  return m.group(1)

s = '''<Report Type="Final Report" SiteName="Get Dataset" Name="Get Metadata" Description="Get Metadata" From="2019-01-16 00:00" Thru="2019-01-16 23:59" obj_device="479999" locations="69,31,">
  <Objective Type="Availability">
    <Goal>99.99</Goal>
    <Actual>100.00</Actual>
    <Compliant>Yes</Compliant>
    <Errors>0</Errors>
    <Checks>2880</Checks>
    </Objective>
  <Objective Type="Uptime">
    <Goal/>
    <Actual/>
    <Compliant/>
    <Errors>0</Errors>
    <Checks>0</Checks>
  </Objective>'''

print('Description: ' + getValue(s,'Description'))
print('From: ' + getValue(s,'From'))
print('Thru: ' + getValue(s,'Thru'))

печать

Description: Get Metadata
From: 2019-01-16 00:00
Thru: 2019-01-16 23:59
0 голосов
/ 17 января 2019
  1. Вы можете сделать это с 1 шаблоном регулярных выражений

    pattern = re.compile('Description="(.*)" From="(.*)" Thru="(.*)" obj')
    
    for founds in re.findall(pattern=pattern, string=string):
        desc, frm, thru = founds
        print(desc)
        print(frm)
        print(thru)
    
    # ouput
    # Get Metadata
    # 2019-01-16 00:00
    # 2019-01-16 23:59
    
  2. Или вы можете сделать один и тот же шаг с разными узорами

    pattern_desc = re.compile('Description="(.*)" From')
    pattern_frm = re.compile('From="(.*)" Thru')
    pattern_thru = re.compile('Thru="(.*)" obj')
    
    re.findall(pattern_desc, string) 
    # output: ['Get Metadata']
    
    re.findall(pattern_frm, string)
    # output: ['2019-01-16 00:00']
    
    re.findall(pattern_thru, string)
    # output: ['2019-01-16 23:59'] 
    
0 голосов
/ 17 января 2019

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

import re

long_string = '''
<Report Type="Final Report" SiteName="Get Dataset" Name="Get Metadata" Description="Get Metadata" From="2019-01-16 00:00" Thru="2019-01-16 23:59" obj_device="479999" locations="69,31,">
  <Objective Type="Availability">
    <Goal>99.99</Goal>
    <Actual>100.00</Actual>
    <Compliant>Yes</Compliant>
    <Errors>0</Errors>
    <Checks>2880</Checks>
    </Objective>
  <Objective Type="Uptime">
    <Goal/>
    <Actual/>
    <Compliant/>
    <Errors>0</Errors>
    <Checks>0</Checks>
  </Objective>
'''

match = re.search('Description=\"(.+?)\" From=\"(.+?)\" Thru=\"(.+?)\"', long_string)

if match:
    print(match.group(1))
    print(match.group(2))
    print(match.group(3))

Это дает такой вывод:

Get Metadata
2019-01-16 00:00
2019-01-16 23:59

Надеюсь, это поможет.

0 голосов
/ 17 января 2019

Это регулярное выражение должно дать вам содержание описания, остальные должны быть похожими:

'Description="([\w\s]+)" From'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...