Python 正则表达式在一行中查找两个关键词
我对正则表达式这玩意儿有点搞不懂...
我有一个这样的字符串:
<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">
我想用findall()和groups来得到这个结果:
['56242','saddelmageri']
我可以用“synset-[0-9]”来匹配数字,用“{(.*?)}”来匹配单词,但我该怎么写才能得到上面的结果呢?
还有一个后续问题 - 有些行看起来像这样:
<wn20schema:NounSynset rdf:about="&dn;synset-2589" rdfs:label="**{cykel_3: trehjulet cykel; tricykel,1_1}**">
在这种情况下,我想提取{}之间的内容,得到这个结果:
['2589', ['cykel', 'trehjulet cykel', 'tricykel']]
这样我就可以把它放到字典里,作为键(2589): 值(['cykel', 'trehjulet cykel', 'tricykel'])的配对。
有什么想法吗?
4 个回答
1
如果你经常处理这些数据,可以考虑使用一个专门的RDF库,比如RDFLib。如果不需要那么复杂,使用XML解析器绝对是个好选择!
- 如果明天数据不再是一行呢?
- 如果明天
label
在about
之前呢? - 还有很多其他情况,虽然数据依然是有效的XML,但可能会让你的正则表达式出错!
总之,我试着用XML解析器,但遇到了一个“未定义实体错误”,就是在&dn;
那里。你能把文件的开头部分(比如文档类型、命名空间定义等)发上来吗?
1
因为这看起来像是xml数据,所以使用xml解析器会更好,因为用正则表达式解析xml非常非常难,容易出错。
不过,既然你特别提到了正则表达式……
你的要求有点不够明确,而使用正则表达式时,需要非常清楚什么算是匹配。例如,rdfs:label的值后面是否总是会有一个_1需要去掉?每行数据中总是只有一个这样的块,还是每行会有多个?另外,结果的顺序重要吗?
这里有一个快速的解决方案,可能会接近你想要的结果:
import re
data=r'<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">"'
matches=re.findall('synset-([0-9]+).*label="{(.*)_1}"', data)
print "matches:", matches
当我运行上面的代码时,得到的输出是一个包含你想要的两个字符串的二元组列表(虽然顺序不同):
matches: [('56242', 'saddelmageri')]