python Regex:匹配XML标签中内容

总结
Parser具有通用性,处理良性的xml,解析完后你可以得到xml文档任何位置的信息.优先选择
Regex具有针对性,处理非良性的xml,当你预先知道需要匹配的信息位置,尝试Regex
在Update3中给出了一个实例。
我现在有这样的一个字符串:
str="1...A...2...B"
以下两种re分别匹配之间内容,之间内容
p1=re.compile(r'(?<=)(.*?)(?=)')
#p1.findall(str)=['1','2']
p2=re.compile(r'(?<=)(.*?)(?=)')
#p2.findall(str)=['A','B']
问题1:是否能利用'|'操作,使一个pattern来完成如下的匹配:
p3=re.compile(r'(?<=)|(?<=)(.*?)(?=)|(?=)')
#p3.findall(str)=['1','2','A','B']
问题2:能否使用group来完成如下匹配:
p4=re.compile(r'(?<=)(.*?)(?=)(?<=)(.*?)(?=))
#p4.findall(str)=[('1','A'),('2','B')]
Updata1问题2已解决
问题2来源手册中写到:
Ifoneormoregroupsarepresentinthepattern,returnalistofgroups;thiswillbealistoftuplesifthepatternhasmorethanonegroup.
p=re.compile(r'(?<=)(.*?)(?=).+?(?<=)(.*?)(?=))
#p.findall(str)=[('1','A'),('2','B')]
再推荐一个Python正则交互式的网站regex101。
改变正则式,匹配结果能即时更新,很方便测试自己的正则式是否正确。
update2
匹配xml文档的内容,RegexorParser?
Parser适合解析,Parser更robust一些,解析完后你可以得到xml文档任何位置的信息;Regex适合针对性的匹配,处理非良性的xml时,当你预先知道需要匹配的信息位置时,尝试Regex。在**Update3中给出了一个实例。
Update3
问题的回答逐渐转变到同一个声音告诉你"一定不要用Regex解析xml"。
对此我的粗浅看法:
1.我的问题是"Regex匹配XML内容,不是用Regex来解析XML文档"。问题源自基于新闻语料Reuters-21578的文本分类器。数据源就是抓取语料文档中标签内的的信息,并且一一对应起来。这篇文章提到了该语料的处理体会:
这些数据文件貌似是有一定的格式的,我刚开始也试图把他们当做标准的xml文档来处理(因为下载包里还像模像样的包含了一个SGMLDTD的文件),但老是报错。最终发现很多的记录格式是错误的,而且错误千奇百怪。所以干脆放弃,直接把它们全部看做文本文件来处理得了。
我用python中lxml库来尝试parse,结果当然是parse失败,error_log中提示很多mismatch.当然lxml也提供了处理brokenxml的方法,即recover-tryhardtoparsethroughbrokenXML.recover的代价是不易处理PLACES与TEXT信息的对应关系。但换作Regex,匹配规则就类比上述问题:只有当两个group同时匹配到内容,这样的配对信息就保留。如果其中一个为空,这样的配对信息就丢弃。
2.具体问题具体分析,少说绝对
这个问题同样在stackoverflow中出现,回答各式各样。
得票最高的是"不要用Regex来解析xml"。同时也有其它一些启发性的回答,摘录一个
WhileitistruethataskingregexestoparsearbitraryHTMLislikeaskingParisHiltontowriteanoperatingsystem,it'ssometimesappropriatetoparsealimited,knownsetofHTML.
IfyouhaveasmallsetofHTMLpagesthatyouwanttoscrapedatafromandthenstuffintoadatabase,regexesmightworkfine.Forexample,Irecentlywantedtogetthenames,parties,anddistrictsofAustralianfederalRepresentatives,whichIgotoffoftheParliament'sWebsite.Thiswasalimited,one-timejob.
Regexesworkedjustfineforme,andwereveryfasttosetup.
慕尼黑8549860
浏览 360回答 2
2回答

浮云间

>>>str="1...A...2...B">>>p3=re.compile(r'(?

潇潇雨雨

说了多少次……我都嫌烦了……XML的有自己的库lxml,BS4正则就应该用来干它合适的活,而不是费那种脑子整XML
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript