如何优化此正则表达式模式

2024-05-14 22:50:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一堆我需要在字符串中找到的模式,它们如下所示:

<dyn type="dataFrame" name="Main Map" property="reference scale"/>
<dyn type="dataFrame" name="Main Map" property="time"/>
<dyn type="page" property="name"/>
<dyn type="page" property="number"/>
<dyn type="page" property="index"/>
<dyn type="page" property="count"/>
<dyn type="page" property="attribute" field="<Field Name>" domainlookup="true"/>
<dyn type="page" property="attribute" field="<Field Name>" />

用法示例:

^{pr2}$

会导致

Page 1 of 15

我计划使用正则表达式:

<dyn[^>]*/>

这将提供:

regex = re.compile("<dyn[^>]*/>")
string = """Page <dyn type="page" property="index"/> of <dyn type="page" property="count"/>"""
r = regex.search(string)
print regex.findall(string)
[u'<dyn type="page" property="index"/>', u'<dyn type="page" property="count"/>']

但我不知道这是否是最好的模式(我相信还有更好的方法)。这将查找具有该模式的所有模式,但不会找到标记内的属性。有没有一种编写正则表达式的方法,可以将值推送到dictionary对象中,其中的所有值都作为键,值在=符号后?在

我只是觉得有更好的方法可以做到这一点,而且由于我不是regex的天才,我想我应该问问社区。在

谢谢你


Tags: 方法namemapdataframestringindexmaintype
3条回答
(\S+)="([^"]+)"

试试看这个。抓住这个捕获。请参阅演示。在

https://regex101.com/r/nL5yL3/42

group 1作为键,group 2作为值。在

用正则表达式破解XML或HTML可能是徒劳的练习。Pyparsing包含一个表达式构建器助手方法makeHTMLTags,它将生成非常真实的容忍解析器,并生成dict类的返回值。在

from pyparsing import *

dynTag,endDyn = makeHTMLTags("dyn")


sample = """
<dyn type="dataFrame" name="Main Map" property="reference scale"/>
<dyn type="dataFrame" name="Main Map" property="time"/>
<dyn type="page" property="name"/>
<dyn type="page" property="number"/>
<dyn type="page" property="index"/>
<dyn type="page" property="count"/>
<dyn type="page" property="attribute" field="<Field Name>" domainlookup="true"/>
<dyn type="page" property="attribute" field="<Field Name>" />
"""

import pprint
for dyn in dynTag.searchString(sample):
    pprint.pprint(dyn.asDict())
    if "domainlookup" in dyn:
        print "domainlookup =",dyn.domainlookup
    print

分析您的示例可以得到:

^{pr2}$

注意,产生的ParseResults结构将允许您访问已解析的属性,如对象属性(dyn.domainlookup)或dict键(dyn["domainlookup"])。在

使用一个XML解析器,就像内置的^{}。在

示例:

import xml.etree.ElementTree as ET

data = """
<root>
    <dyn type="dataFrame" name="Main Map" property="reference scale"/>
    <dyn type="dataFrame" name="Main Map" property="time"/>
    <dyn type="page" property="name"/>
    <dyn type="page" property="number"/>
    <dyn type="page" property="index">1</dyn>
    <dyn type="page" property="count">15</dyn>
    <dyn type="page" property="attribute" field="Field Name" domainlookup="true"/>
    <dyn type="page" property="attribute" field="Field Name" />
</root>
"""

root = ET.fromstring(data)
index = root.findtext('.//dyn[@property="index"]')
count = root.findtext('.//dyn[@property="count"]')

print "%s of %s" % (index, count)

打印1 of 15。在

注意,这个例子是人为的,因为我不确定真正的XML输入是什么。不过,这个想法还是一样的——一个XML解析器。在

相关问题 更多 >

    热门问题