【问题标题】:Python Regex Google App EnginePython 正则表达式 Google App Engine
【发布时间】:2014-07-01 03:22:49
【问题描述】:

我在 GAE 上使用 python

我正在尝试从 html 中获取以下内容

<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>

我想得到所有后面都有一个“V”和 7 个或更多数字的东西。

我的正则表达式是

response = urllib2.urlopen(url)
html = response.read()
tree = etree.HTML(html)
mls = tree.xpath('/[V]\d{7,10}</FONT>')
self.response.out.write(mls)

它抛出了一个无效的表达式。我不知道它的哪一部分是无效的,因为它适用于在线正则表达式测试器

如何以 xpath 格式执行此操作?

【问题讨论】:

    标签: python regex


    【解决方案1】:
    >>> import re
    
    >>> s = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>'
    
    >>> a = re.search(r'(.*)(V[0-9]{7,})',s)
    
    >>> a.group(2)
    'V1068078'
    

    编辑

    (.*) 是一种贪婪的方法。 re.search(r'V[0-9]{7,}',s) 将不贪婪地进行提取。

    EDIT 正如@Kaneg 所说,您可以在所有情况下使用findall。您将获得一个列表,其中包含所有出现的 'V[0-9]{7,}'

    【讨论】:

    • 感谢苏库。如果我想使用xpath,那我该怎么办?
    • 在搜索开始时做一个贪婪搜索(.*)有什么意义?
    • @MartinKonecny,是的。我们这里不需要它。编辑了我的答案。
    【解决方案2】:

    如何在 XPath 中执行此操作?

    您可以在此处使用starts-with()

    >>> from lxml import etree
    >>> html = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>'
    >>> tree = etree.fromstring(html)
    >>> mls  = tree.xpath("//TD/FONT[starts-with(text(),'V')]")[0].text
    'V1068078'
    

    或者你可以使用正则表达式

    >>> from lxml import etree
    >>> html = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>'
    >>> tree = etree.fromstring(html)
    >>> mls  = tree.xpath("//TD/FONT[re:match(text(), 'V\d{7,}')]", 
               namespaces={'re': 'http://exslt.org/regular-expressions'})[0].text
    'V1068078'
    

    【讨论】:

      【解决方案3】:

      下面的例子可以匹配多种情况:

      import re
      s = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V10683333</FONT></TD>,' \
      ' <TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068333333</FONT></TD>'
      m = re.findall(r'V\d{7,}', s)
      print m
      

      【讨论】:

        【解决方案4】:

        以下将起作用:

        result = re.search(r'V\d{7,}',s)
        print result.group(0)  # prints 'V1068078'
        

        它将匹配字母V之后的任何长度为7或以上的数字字符串

        编辑

        如果您希望它找到所有实例,请将search 替换为findall

        s = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>V1068078   V1068078   V1068078'
        re.search(r'V\d{7,}',s)
        ['V1068078', 'V1068078', 'V1068078', 'V1068078']
        

        【讨论】:

        • 是的,如果您想找到超过 1 个,请更新我的答案。
        【解决方案5】:

        对于一直发布纯正则表达式解决方案的每个人,您需要阅读问题——问题不仅仅是制定正则表达式;这是一个隔离 XML/HTML 文档树的正确节点的问题,可以使用正则表达式随后隔离所需的字符串。

        您没有显示任何导入语句 - 您是否尝试使用 ElementTree?为了使用 ElementTree,您需要对 XML/HTML 的结构有所了解,从根到目标标记(在您的情况下为“TD/FONT”)。接下来,您将使用 ElementTree 方法“find”和“findall”来遍历树并获取所需的标签/属性。

        noted previously 一样,“ElementTree 使用自己的路径语法,它或多或少是 xpath 的一个子集。如果您想要一个具有完整 xpath 支持的 ElementTree 兼容库,请尝试lxml。” ElementTree 确实支持xpath,但不是您在此处使用它的方式。

        如果您确实想使用 ElementTree,您应该提供一个您尝试解析的 html 示例,以便每个人都对结构有一个概念。在没有这样的例子的情况下,一个虚构的例子如下所示:

        import xml, urllib2
        from xml.etree import ElementTree
        
        
        url = "http://www.uniprot.org/uniprot/P04637.xml"
        response = urllib2.urlopen(url)
        html = response.read()
        tree = xml.etree.ElementTree.fromstring(html)
        # namespace prefix, see https://stackoverflow.com/questions/1249876/alter-namespace-prefixing-with-elementtree-in-python
        ns = '{http://uniprot.org/uniprot}'
        root = tree.getiterator(ns+'uniprot')[0]
        taxa = root.find(ns+'entry').find(ns+'organism').find(ns+'lineage').findall(ns+'taxon')
        for taxon in taxa:
          print taxon.text
        
        # Output:
        Eukaryota
        Metazoa
        Chordata
        Craniata
        Vertebrata
        Euteleostomi
        Mammalia
        Eutheria
        Euarchontoglires
        Primates
        Haplorrhini
        Catarrhini
        Hominidae
        Homo
        

        【讨论】:

          【解决方案6】:

          还有一个没有捕获组的。

          >>> import re
          >>> str = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>'
          >>> m = re.search(r'(?<=>)V\d{7}', str)
          >>> print m.group(0)
          V1068078
          

          【讨论】:

            猜你喜欢
            • 2014-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-26
            • 2010-09-12
            相关资源
            最近更新 更多