Ich versuche, Zeichenfolgen zu analysieren, die so aussehen.

<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>

Ich möchte Regex verwenden, um die Position von 'Beschreibung' zu finden und dann zwischen den Anführungszeichen zu setzen, also möchte ich 'Get Metadata'. Dann möchte ich die Position von 'Von' finden und die Zeichenfolge zwischen den Anführungszeichen abrufen, also möchte ich diese '2019-01-16 00:00'. Schließlich möchte ich die Position von 'Thru' finden und die Zeichenfolge zwischen den Anführungszeichen erhalten, also möchte ich diese '2019-01-16 23:59'. Wie kann ich dies mit 3 separaten Regex-Befehlen tun und dies in 3 separate Zeichenfolgen analysieren? TIA.

-1
ASH 17 Jän. 2019 im 20:06

4 Antworten

Ich habe ein kleines Arbeitsbeispiel mit einem regulären Ausdruck zusammengestellt, um die Daten zu erhalten, nach denen Sie suchen.

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))

Es gibt diese Ausgabe:

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

Hoffe das hilft.

1
takacsmark 17 Jän. 2019 im 17:48

Ihre drei regulären Ausdrücke, die Sie zum Erfassen der genannten Werte benötigen, sind folgende:

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

Was Sie dynamisch über eine Funktion generieren und wiederverwenden können, um Wert für jeden Datentyp zu finden. Probieren Sie diese Python-Code-Demo aus.

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'))

Drucke,

Description: Get Metadata
From: 2019-01-16 00:00
Thru: 2019-01-16 23:59
1
Pushpesh Kumar Rajwanshi 17 Jän. 2019 im 18:00

In reinem Python sollte es ungefähr so sein:

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
Ali Hallaji 17 Jän. 2019 im 18:03

Diese Regex sollte Ihnen den Inhalt der Beschreibung geben, die anderen sollten ähnlich sein:

'Description="([\w\s]+)" From'
1
Franco Piccolo 17 Jän. 2019 im 17:39