Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何优化这个正则表达式模式_Python_Regex_Python 2.7 - Fatal编程技术网

Python 如何优化这个正则表达式模式

Python 如何优化这个正则表达式模式,python,regex,python-2.7,Python,Regex,Python 2.7,我需要在字符串中找到一系列模式,它们如下所示: <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

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

<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>" />
我计划使用以下的正则表达式:

<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"/>']
regex=re.compile(“]*/>”)
字符串=“第页,共页”“”
r=regex.search(字符串)
打印regex.findall(字符串)
[u'',u'']
但我不知道这是否是最好的模式(我相信有更好的方法)。这将找到包含该模式的所有模式,但不会找到标记内的属性。有没有一种编写正则表达式的方法,可以将值推送到一个dictionary对象,其中包含as键中的所有值以及=号之后的值

我只是觉得有更好的方法可以做到这一点,既然我不像regex那样是个天才,我想我应该问问社区

多谢各位

(\S+)="([^"]+)"
试试这个。抓拍。看演示

组1
作为键,将
组2
作为值。

使用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)
将xml.etree.ElementTree作为ET导入
data=”“”
1.
15
"""
root=ET.fromstring(数据)
index=root.findtext('.//dyn[@property=“index”]”)
count=root.findtext('.//dyn[@property=“count”]”)
打印“%s(共%s)”%(索引,计数)
打印第1张,共15张


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

用正则表达式破解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
从pyparsing导入*
dynTag,endDyn=makeHTMLTags(“dyn”)
样本=”“
"""
导入pprint
对于dynTag.searchString中的dyn(示例):
pprint.pprint(dyn.asDict())
如果dyn中有“domainlookup”:
打印“domainlookup=”,dyn.domainlookup
打印
分析您的示例将提供:

{'empty': True,
 'name': 'Main Map',
 'property': 'reference scale',
 'startDyn': (['dyn', (['type', 'dataFrame'], {}), (['name', 'Main Map'], {}), (['property', 'reference scale'], {}), True], {'type': [('dataFrame', 1)], 'property': [('reference scale', 3)], 'tag': [('dyn', 0)], 'name': [('Main Map', 2)], 'empty': [(True, 4)]}),
 'tag': 'dyn',
 'type': 'dataFrame'}

{'empty': True,
 'name': 'Main Map',
 'property': 'time',
 'startDyn': (['dyn', (['type', 'dataFrame'], {}), (['name', 'Main Map'], {}), (['property', 'time'], {}), True], {'type': [('dataFrame', 1)], 'property': [('time', 3)], 'tag': [('dyn', 0)], 'name': [('Main Map', 2)], 'empty': [(True, 4)]}),
 'tag': 'dyn',
 'type': 'dataFrame'}

{'empty': True,
 'property': 'name',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'name'], {}), True], {'type': [('page', 1)], 'property': [('name', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'empty': True,
 'property': 'number',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'number'], {}), True], {'type': [('page', 1)], 'property': [('number', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'empty': True,
 'property': 'index',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'index'], {}), True], {'type': [('page', 1)], 'property': [('index', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'empty': True,
 'property': 'count',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'count'], {}), True], {'type': [('page', 1)], 'property': [('count', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'domainlookup': 'true',
 'empty': True,
 'field': '<Field Name>',
 'property': 'attribute',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'attribute'], {}), (['field', '<Field Name>'], {}), (['domainlookup', 'true'], {}), True], {'field': [('<Field Name>', 3)], 'tag': [('dyn', 0)], 'domainlookup': [('true', 4)], 'property': [('attribute', 2)], 'type': [('page', 1)], 'empty': [(True, 5)]}),
 'tag': 'dyn',
 'type': 'page'}
domainlookup = true

{'empty': True,
 'field': '<Field Name>',
 'property': 'attribute',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'attribute'], {}), (['field', '<Field Name>'], {}), True], {'field': [('<Field Name>', 3)], 'property': [('attribute', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 4)], 'type': [('page', 1)]}),
 'tag': 'dyn',
 'type': 'page'}
{'empty':True,
“名称”:“主地图”,
“属性”:“参考比例”,
‘startDyn’:(['dyn',(['type','dataFrame'],{}),(['name','Main Map'],{}),(['property','reference scale'],{}),True],{'type':[('dataFrame',1)],'property':[('reference scale',3)],'tag:[('dyn',0)],'name':[('Main Map',2],'empty':[(True,4)],
“tag”:“dyn”,
'type':'dataFrame'}
{'empty':对,
“名称”:“主地图”,
“属性”:“时间”,
‘startDyn’:(['dyn',(['type','dataFrame'],{}),(['name','mainmap'],{}),(['property','time'],{}),True],{'type':[('dataFrame',1)],'property':[('time',3)],'tag:[('dyn',0)],'name:[('mainmap',2],'empty':[(True,4)],
“tag”:“dyn”,
'type':'dataFrame'}
{'empty':对,
'属性':'名称',
'startDyn':(['dyn',(['type','page'],{}),(['property','name'],{}),True],{'type':[('page',1)],'property':[('name',2)],'tag':[('dyn',0)],'empty':[(True,3)],
“tag”:“dyn”,
“类型”:“页面”}
{'empty':对,
'属性':'编号',
‘startDyn’:(['dyn',(['type','page'],{}),(['property','number'],{}),True],{'type':[('page',1)],'property':[('number',2)],'tag:[('dyn',0)],'empty':[(True,3)],
“tag”:“dyn”,
“类型”:“页面”}
{'empty':对,
“属性”:“索引”,
'startDyn':(['dyn',(['type','page'],{}),(['property','index'],{}),True],{'type':[('page',1)],'property':[('index',2)],'tag':[('dyn',0)],'empty':[(True,3)],
“tag”:“dyn”,
“类型”:“页面”}
{'empty':对,
'属性':'计数',
‘startDyn’:(['dyn',(['type','page'],{}),(['property','count'],{}),True],{'type':[('page',1)],'property':[('count',2)],'tag:[('dyn',0)],'empty':[(True,3)],
“tag”:“dyn”,
“类型”:“页面”}
{'domainlookup':'true',
“空”:对,
“字段”:“,
'属性':'属性',
‘startDyn’:(['dyn',(['type','page'],{}),(['property','attribute'],{}),(['field','field','true'],{}),true],{'field':[('dyn',0)],'domainlookup':[('true',4)],'property':[('attribute',2],'type':[('page',1','empty':[(true,5)],
“tag”:“dyn”,
“类型”:“页面”}
domainlookup=true
{'empty':对,
“字段”:“,
'属性':'属性',
“startDyn”:(['dyn',(['type',page'],{}),(['property','attribute'],{}),(['field',''],{}),True],{'field':[(''attribute',3)],'property':[('attribute',2)],'tag:[('dyn',0)],'empty':[(True,4)],'type':[('page',1)],
“tag”:“dyn”,
“类型”:“页面”}

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

您的预期输出是什么?@AvinashRaj-我想要括号内的值的键/值对。例如:{'type':'page','property':'index'}等等……谢谢你,但我认为这并没有达到我的目的。标记格式在任何给定字符串中都是这样表示的。比如“我走到我家泡茶,很好吃”。所以,既然它不是纯XML,我认为这就行不通了?我错了吗?@josh1234你是对的,
xml.etree.ElementTree
不会从文本中提取xml部分。这与我需要的非常接近,我发现如果你将表达式用作句子,我会得到奇怪的结果。请参阅:。结果在键的左侧显示了额外的文本,有没有办法消除它?太棒了!这正是我想要的,我知道有更好的方法!谢谢你的帮助!我将使用以下模式:(\S+”([^“]+)“这些都是我现在正在寻找的有效模式,而不是数据的呈现方式。@josh1234-这意味着什么?看看您对alecxe的回答,我认为pyparsing仍然是一个不错的选择。你是说你现在只想挑选
标签吗?您可以使用pyparsing的
originalTextFor
方法来实现这一点,只需使用
originalTextFor(dynTag)
即可获得匹配的XML文本。但是
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
{'empty': True,
 'name': 'Main Map',
 'property': 'reference scale',
 'startDyn': (['dyn', (['type', 'dataFrame'], {}), (['name', 'Main Map'], {}), (['property', 'reference scale'], {}), True], {'type': [('dataFrame', 1)], 'property': [('reference scale', 3)], 'tag': [('dyn', 0)], 'name': [('Main Map', 2)], 'empty': [(True, 4)]}),
 'tag': 'dyn',
 'type': 'dataFrame'}

{'empty': True,
 'name': 'Main Map',
 'property': 'time',
 'startDyn': (['dyn', (['type', 'dataFrame'], {}), (['name', 'Main Map'], {}), (['property', 'time'], {}), True], {'type': [('dataFrame', 1)], 'property': [('time', 3)], 'tag': [('dyn', 0)], 'name': [('Main Map', 2)], 'empty': [(True, 4)]}),
 'tag': 'dyn',
 'type': 'dataFrame'}

{'empty': True,
 'property': 'name',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'name'], {}), True], {'type': [('page', 1)], 'property': [('name', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'empty': True,
 'property': 'number',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'number'], {}), True], {'type': [('page', 1)], 'property': [('number', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'empty': True,
 'property': 'index',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'index'], {}), True], {'type': [('page', 1)], 'property': [('index', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'empty': True,
 'property': 'count',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'count'], {}), True], {'type': [('page', 1)], 'property': [('count', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 3)]}),
 'tag': 'dyn',
 'type': 'page'}

{'domainlookup': 'true',
 'empty': True,
 'field': '<Field Name>',
 'property': 'attribute',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'attribute'], {}), (['field', '<Field Name>'], {}), (['domainlookup', 'true'], {}), True], {'field': [('<Field Name>', 3)], 'tag': [('dyn', 0)], 'domainlookup': [('true', 4)], 'property': [('attribute', 2)], 'type': [('page', 1)], 'empty': [(True, 5)]}),
 'tag': 'dyn',
 'type': 'page'}
domainlookup = true

{'empty': True,
 'field': '<Field Name>',
 'property': 'attribute',
 'startDyn': (['dyn', (['type', 'page'], {}), (['property', 'attribute'], {}), (['field', '<Field Name>'], {}), True], {'field': [('<Field Name>', 3)], 'property': [('attribute', 2)], 'tag': [('dyn', 0)], 'empty': [(True, 4)], 'type': [('page', 1)]}),
 'tag': 'dyn',
 'type': 'page'}