1

我有这个字符串:

História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares

我想得到 betweenCATEG="(what I want to get)"和 between ">(what I want to get)</EM>,在这种情况下结果是PESSOAand RFID

我所拥有的是

pega = re.sub(r'<[^C]*(CATEG="[^"]+")[^>]*>', r'<\1>', text)

但结果只是

RFID 的历史 RFID 技术 < tem suas raízes nos sistemas de radares

我该怎么做?

4

7 回答 7

4

您可以使用内置的 minidom 模块轻松解析:

from xml.dom import minidom

xml = '<xml>História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares</xml>'
dom = minidom.parseString(xml)
em = dom.getElementsByTagName('EM')[0]
categ = em.getAttribute('CATEG')
text = " ".join(t.nodeValue for t in em.childNodes if t.nodeType == t.TEXT_NODE)

或者使用内置 ElementTree 模块的不那么冗长的方式:

from xml.etree import ElementTree

xml = '<xml>História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares</xml>'
tree = ElementTree.fromstring(xml)
em = tree.find('EM')
categ = em.attrib['CATEG']
text = em.text
于 2013-09-18T19:15:55.397 回答
2

这是一个使用beautifulsoup的解决方案:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
soup = BeautifulSoup('''História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares''')
print soup.em['id']
print soup.em['categ']

你会注意到这是第二个最简洁的解决方案,也是最可维护的,因为没有复杂的表达式需要理解。

于 2013-09-18T20:10:47.493 回答
1

拆分功能可能是解决此问题的简单方法

s = "História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares"
# FOR PESSOA
t1 = s.split("CATEG=\"")[1]
t1 = t1.split("\"")[0]    
# FOR RFID
t2 = s.split(" </EM>")[0]
t2 = t2.split(">")[1]
print t1,t2
于 2013-09-18T22:09:44.617 回答
1

没有更多信息,很难说。以下内容可能对您的需求过于具体,但它可以满足您的要求。希望它至少能让你开始。

#!/usr/bin/python                                                               
# -*- coding: utf-8 -*-                                                         

import re

text='História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>tem suas raízes nos sistemas de radares'

m = re.compile(r'CATEG="([^"]*)">([^>]*)</')
result = m.search(text)

print result.groups()

输出是:

('PESSOA', 'RFID ')
于 2013-09-18T18:53:09.810 回答
1

尝试使用re.search

>>> result = re.search(r'CATEG="([^"]+)"[^>]*>([^<]+)', text)
>>> print result.group(1)
PESSOA
>>> print result.group(2)
RFID 

正则表达式 101 演示

ideone 演示

不要只是打印result,因为它是 python 中的一个对象。您需要将它们打印为字符串,因此您可以使用.group()(如果您n在括号内放置一个整数,您将获得第nth 个捕获组)。

于 2013-09-18T18:53:49.087 回答
0

如果你愿意,你可以使用标准库HTMLParser不是最好的选择,但可能很有趣):

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

    data = ""
    search_tag = None
    search_attr = None
    attr = None
    grab_data = False

    def to_dict(self, attrs):
        ret = {}
        for k, v in attrs: ret[k] = v
        return ret

    def feed(self, data, tag, attr):

        self.search_tag = tag
        self.search_attr = attr
        HTMLParser.feed(self, data)

    def handle_starttag(self, tag, attrs):

        attrs = self.to_dict(attrs)
        if tag == self.search_tag:
            if self.search_attr in attrs:
                self.attr = attrs[self.search_attr]
            self.grab_data = 1

    def handle_data(self, data):

        if self.grab_data:
            self.data = data

    def handle_endtag(self, tag):

        if tag == self.search_tag:
            self.grab_data = 0

xml = u'História do RFID A tecnologia de <EM ID="hub-30518" CATEG="PESSOA">RFID </EM>\
                                                tem suas raízes nos sistemas de radares'

parser = MyHTMLParser()
parser.feed(xml, "em", "categ")
print parser.data, parser.attr
于 2013-09-20T13:58:00.690 回答
0
r'.*?<EM.*?CATEG="(.*?)".*?>(.*?)<//EM>.*?'

这样就可以了。group(1) 将是您的类别,而 group(2) 将是您的标记词。

于 2013-09-18T18:43:48.263 回答