【问题标题】:How to use a regex to find quoted attribute values in an OPML (XML) file如何使用正则表达式在 OPML (XML) 文件中查找引用的属性值
【发布时间】:2013-04-24 20:26:27
【问题描述】:

我正在搜索一个看起来像这样的 OPML 文件。我想提取大纲文本和 xmlUrl。

  <outline text="lol">
  <outline text="Discourse on the Otter" xmlUrl="http://discourseontheotter.tumblr.com/rss" htmlUrl="http://discourseontheotter.tumblr.com/"/>
  <outline text="fedoras of okc" xmlUrl="http://fedorasofokc.tumblr.com/rss" htmlUrl="http://fedorasofokc.tumblr.com/"/>
  </outline>

我的功能:

 import re
 rssName = 'outline text="(.*?)"'
 rssUrl =  'xmlUrl="(.*?)"'

 def rssSearch():
     doc = open('ttrss.txt')
     for line in doc:
        if "xmlUrl" in line:
            mName = re.search(rssName, line)
            mUrl = re.search(rssUrl, line)
            if mName is not None:
                print mName.group()
                print mUrl.group()

但是,返回值如下:

 outline text="fedoras of okc"
 xmlUrl="http://fedorasofokc.tumblr.com/rss"

什么是 rssName 和 rssUrl 的正确正则表达式,以便我只返回引号之间的字符串?

【问题讨论】:

  • 与您的问题完全无关,但可能仍然有帮助:您可以预编译正则表达式以节省几纳秒的执行时间。使用rssName = re.compile('outline text="(.*?)"')mName = rssName.search(line)
  • 你为什么要通过正则表达式来做到这一点?这不是正确的工具。使用xml解析器,标准库里有好几种。
  • 关于@DanielRoseman 的建议,如果您想要一些易于使用的东西,包括厨房水槽,请查看美丽的石头汤,美丽汤库的 XML 解析组件。

标签: python xml regex opml


【解决方案1】:

不要使用正则表达式来解析 XML。代码乱七八糟,出错的地方太多了。

例如,如果您的 OPML 提供商碰巧像这样重新格式化他们的输出:

<outline text="lol">
  <outline
      htmlUrl="http://discourseontheotter.tumblr.com/"
      xmlUrl="http://discourseontheotter.tumblr.com/rss"
      text="Discourse on the Otter"
  />
  <outline
      htmlUrl="http://fedorasofokc.tumblr.com/"
      xmlUrl="http://fedorasofokc.tumblr.com/rss"
      text="fedoras of okc"
  />
</outline>

这是完全正确的,它的意思完全一样。但是像'outline text="(.*?)"' 这样的面向行的搜索和正则表达式将会中断。

改为使用 XML 解析器。您的代码会更简洁、更可靠:

import xml.etree.cElementTree as ET

root = ET.parse('ttrss.txt').getroot()
for outline in root.iter('outline'):
    text = outline.get('text')
    xmlUrl = outline.get('xmlUrl')
    if text and xmlUrl:
        print text
        print xmlUrl

这会处理您的 OPML sn-p 和我在网上找到的类似 OPML 文件,例如 political science list。它非常简单,没有什么棘手的。 (我不是在吹牛,这只是使用 XML 解析器而不是正则表达式的好处。)

【讨论】:

    【解决方案2】:

    试试

    print mName.group(1)
    print mUrl.group(1)
    

    http://docs.python.org/2/library/re.html#re.MatchObject.group

    如果 groupN 参数为零,则对应的返回值是整个匹配字符串;如果在包含范围[1..99]内,则为匹配对应括号组的字符串。

    rssName = 'outline text="(?P<text>.*?)"'
    

    然后

    print mName.group('text')
    

    【讨论】:

    • 谢谢! 1 在这里表示什么以及它是如何解决问题的?
    猜你喜欢
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2011-01-15
    • 2021-08-17
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多