Python 正则表达式在一行中查找两个关键词

1 投票
4 回答
974 浏览
提问于 2025-04-15 17:25

我对正则表达式这玩意儿有点搞不懂...

我有一个这样的字符串:

<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解析器绝对是个好选择!

  • 如果明天数据不再是一行呢?
  • 如果明天labelabout之前呢?
  • 还有很多其他情况,虽然数据依然是有效的XML,但可能会让你的正则表达式出错!

总之,我试着用XML解析器,但遇到了一个“未定义实体错误”,就是在&dn;那里。你能把文件的开头部分(比如文档类型、命名空间定义等)发上来吗?

2

请查看这个问题最佳回答。用正则表达式来解析XML通常是个很糟糕的主意。因为XML解析器就是为了这个目的而设计的。

最快的方法可能就是使用Python自带的minidom

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')]

撰写回答