pythonregexp在lin中查找两个关键字

2024-10-03 02:42:36 发布

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

我很难理解这些正则表达式。。。在

我有一根这样的绳子:

<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">

我想使用findall()和groups来获得:

^{pr2}$

我可以用“synset-[0-9]”来匹配数字,用“{(.*?)来匹配单词}“但是我怎么写才能得到上面的结果呢?在

下面是一个问题,下面是一些问题:

<wn20schema:NounSynset rdf:about="&dn;synset-2589" rdfs:label="**{cykel_3: trehjulet cykel; tricykel,1_1}**">

在本例中,我想提取{}之间的内容,结果如下:

['2589', ['cykel', 'trehjulet cykel', 'tricykel']]

这样我以后可以把它作为key(2589):value(['cykel','trehjulet cykel','tricykel'])对放入字典。在

有什么想法吗?在


Tags: rdflabelaboutgroupsdnsynset绳子findall
3条回答

请参见对this question的顶部答案。用正则表达式解析xml通常是个糟糕的主意。XML解析器就是为此而构建的。在

最快的方法可能是python的built-in minidom

如果您经常使用这些数据,甚至可以考虑使用专门的RDF库(例如RDFLib)。 如果不是这样,XML解析器绝对是最好的选择!在

  • 如果明天不在一条线上呢?在
  • 如果明天label会在{之前出现呢?在
  • 至少还有十几种方法可以使它保持有效的XML,但会破坏regexp!在

不管怎样,我尝试应用一个XML解析器,但是那里的&dn;出现了一个“未定义的实体错误”。你能发布文件的顶部吗(doctype、命名空间定义等等)?在

由于这似乎是xml数据,所以最好使用xml解析器,因为用正则表达式解析xml非常非常困难。在

但是,既然你特别要求一个正则表达式。。。在

您的规范有点不精确,对于正则表达式,您需要非常精确地确定什么是匹配。例如,将rdfs:标签值总是有一个你想脱掉的?每行总是只有一个这样的数据块,还是每行有多个?还有,结果的顺序重要吗?在

这里有一个快速的方法,可以让你接近你想要的:

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

当我运行上述命令时,我得到以下输出,这是一个包含两个元组的列表,其中包含您想要的两个字符串(尽管顺序不同):

^{pr2}$

相关问题 更多 >