2013-08-11 3 views
9

के साथ पायथन में एक्सएमएल पार्सिंग मैं XML फ़ाइल को पार्स करने के लिए रेगेक्स का उपयोग करने की कोशिश कर रहा हूं (मेरे मामले में यह सबसे आसान तरीका लगता है)।रीजिक्स

उदाहरण के लिए एक लाइन हो सकता है:

line='<City_State>PLAINSBORO, NJ 08536-1906</City_State>' 

टैग City_State के लिए पाठ का उपयोग करने के लिए, मैं उपयोग कर रहा हूँ:

attr = re.match('>.*<', line) 

लेकिन कुछ नहीं लौटे जा रहा है।

कोई बता सकता है कि मैं क्या गलत कर रहा हूं?

+10

की तरह एक XML पार्सर का उपयोग मैं लिंक करने के लिए मजबूर हूँ [इस उत्तर] (http://stackoverflow.com/a/1732454/78845)। – Johnsyweb

+0

एक उचित XML लाइब्रेरी का उपयोग करना मुश्किल नहीं है जब आपको अपनी पसंद की लाइब्रेरी मिल जाए। मैंने पाया [ElementTree] (http://docs.python.org/2/library/xml.etree.elementtree.html) मानक लाइब्रेरी में से किसी एक का उपयोग करने के लिए सबसे अच्छा, और [untangle] (https://github.com/stchris/untangle) सबसे आसान (यह एक्सएमएल को नियमित शब्दकोशों/सूचियों आदि में परिवर्तित करता है) – dbr

+0

डांग, @ जॉन्सवेव ने मुझे इसे हराया! – torek

उत्तर

13

आप आमतौर पर re.match का उपयोग नहीं करना चाहते हैं। Quoting from the docs:

आप स्ट्रिंग में कहीं भी एक मैच का पता लगाने, बजाय search() उपयोग करना चाहते हैं (यह भी search() vs. match() देखें)।

नोट:

>>> print re.match('>.*<', line) 
None 
>>> print re.search('>.*<', line) 
<_sre.SRE_Match object at 0x10f666238> 
>>> print re.search('>.*<', line).group(0) 
>PLAINSBORO, NJ 08536-1906< 

इसके अलावा, क्यों regex जब आप BeautifulSoup की तरह कुछ का उपयोग कर सकते :) साथ पार्स एक्सएमएल।

>>> from bs4 import BeautifulSoup as BS 
>>> line='<City_State>PLAINSBORO, NJ 08536-1906</City_State>' 
>>> soup = BS(line) 
>>> print soup.find('city_state').text 
PLAINSBORO, NJ 08536-1906 
0

re.match एक मैच ही अगर पैटर्न पूरे स्ट्रिंग से मेल खाता देता है। पैटर्न से मेल खाने वाले सबस्ट्रिंग्स को खोजने के लिए, re.search का उपयोग करें।

और हाँ, यह XML को पार्स करने का एक आसान तरीका है, लेकिन मैं आपको विशेष रूप से कार्य के लिए डिज़ाइन की गई लाइब्रेरी का उपयोग करने के लिए प्रोत्साहित करता हूं।

+0

यह वास्तव में "एक्सएमएल पार्स करने का एक आसान तरीका" होगा यदि यह वास्तव में _did_ XML को पार्स करता है। जो यह नहीं करता है। (देखें: टिप्पणी या सीडीएटीए ब्लॉक का पता लगाने के लिए समर्थन की कमी; चरित्र इकाइयों को संभालने के लिए आदि आदि)। –

+0

मामूली बिंदु: 're.match' बाईं ओर लंगर है लेकिन पूरे स्ट्रिंग का उपभोग नहीं करना है। बहुत कम, रेगेक्सपी 'एक्स' दिया गया, 're.match''^X' (लेकिन '^ X $' नहीं) का उपयोग करके 're.search' जैसा है। अन्य मतभेद हैं, विशेष रूप से न्यूलाइन युक्त तारों के साथ; [हैड्रो के उत्तर] में दस्तावेज़ लिंक देखें (http://stackoverflow.com/a/18168699/1256452)। – torek

5

कृपया, बस ElementTree

>>> from xml.etree import ElementTree as ET 
>>> line='<City_State>PLAINSBORO, NJ 08536-1906</City_State>' 
>>> ET.fromstring(line).text 
'PLAINSBORO, NJ 08536-1906' 
संबंधित मुद्दे