Python regexp在一行中查找两个关键字

Python regexp在一行中查找两个关键字,python,regex,findall,Python,Regex,Findall,我很难理解这个正则表达式 我有这样一个字符串: <wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}"> <wn20schema:NounSynset rdf:about="&dn;synset-2589" rdfs:label="**{cykel_3: trehjulet cykel; tricykel,1_1}**"> 我可以将数字与syns

我很难理解这个正则表达式

我有这样一个字符串:

<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">
<wn20schema:NounSynset rdf:about="&dn;synset-2589" rdfs:label="**{cykel_3: trehjulet cykel; tricykel,1_1}**">
我可以将数字与synset-[0-9]之类的东西匹配,将单词与{.*?}之类的东西匹配,但是如何编写它来获得上述结果呢

下面是一个后续问题-一些线条看起来像这样:

<wn20schema:NounSynset rdf:about="&dn;synset-56242" rdfs:label="{saddelmageri_1}">
<wn20schema:NounSynset rdf:about="&dn;synset-2589" rdfs:label="**{cykel_3: trehjulet cykel; tricykel,1_1}**">
所以我可以把它作为键2589:value['cykel','trehjulet-cykel','tricykel']对放到字典里

有什么想法吗?

请看最上面的答案。用正则表达式解析xml通常是一个糟糕的想法。XML解析器就是为此而构建的

要做到这一点,最快的方法可能是python的

请参见的顶部答案。用正则表达式解析xml通常是一个糟糕的想法。XML解析器就是为此而构建的


最快的方法可能是python的

,因为这似乎是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

因为这似乎是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

如果你对这些数据做了很多,甚至可以考虑一个专门的RDF库,例如RDFLIB。 如果不是的话,那么XML解析器绝对是一条出路

如果明天它不在一条线上呢? 如果明天标签会出现在订单上怎么办? 至少还有十几种方法可以使它保持有效的XML,但会破坏您的regexp!
无论如何,我尝试应用XML解析器,但是我得到了一个未定义的实体错误&dn;那里您可以发布文件DOCTYPE、命名空间定义等的顶部吗?

< P>如果您对这些数据做了大量的工作,请考虑一个专门的RDF库,例如RDFLIB。 如果不是的话,那么XML解析器绝对是一条出路

如果明天它不在一条线上呢? 如果明天标签会出现在订单上怎么办? 至少还有十几种方法可以使它保持有效的XML,但会破坏您的regexp!
无论如何,我尝试应用XML解析器,但是我得到了一个未定义的实体错误&dn;那里您可以发布文件doctype、名称空间定义等的顶部吗?

您在这里执行两种不同类型的解析,需要使用两种不同的工具

首先,您正在解析XML。为此,需要使用XML解析器,而不是正则表达式。因为这些元素在功能上是相同的XML:

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

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

<wn20schema:NounSynset rdfs:label="{saddelmageri_1}" rdf:about="&dn;synset-56242"/>
现在,您可以看问题的第二部分,即从现有的属性值中解析所需的值。为此,可以使用正则表达式。要分析about属性,这可能会起作用:

re.match(r'[^\d]*(\d*)', about).groups()[0]
返回找到的第一个数字字符序列。要分析label属性,可以使用:

re.match(r'{([^_]*)', label).groups()[0]

它返回标签中的所有字符,这些字符位于左大括号的前面,直到但不包括第一个下划线。至于解析您发布的第二种形式的标签,您还没有发布足够的信息,我无法猜测要解析的正则表达式是什么样子。

您在这里进行了两种不同的解析,需要使用两种不同的工具

首先,您正在解析XML。为此,需要使用XML解析器,而不是正则表达式。因为这些元素在功能上是相同的XML:

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

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

<wn20schema:NounSynset rdfs:label="{saddelmageri_1}" rdf:about="&dn;synset-56242"/>
现在,您可以看问题的第二部分,即从现有的属性值中解析所需的值。为此,可以使用正则表达式。要分析about属性,这可能会起作用:

re.match(r'[^\d]*(\d*)', about).groups()[0]
返回找到的第一个数字字符序列。要分析label属性,可以使用:

re.match(r'{([^_]*)', label).groups()[0]
它返回标签中的所有字符,这些字符位于左大括号的前面,直到但不包括第一个下划线。至于解析您发布的第二种形式的标签,您必须
我没有发布足够的信息来猜测要解析的正则表达式是什么样子。

不要用锤子来切火鸡,阅读:这不是使用正则表达式的理由。@balpha,+1!您应该改为使用XML解析器。不要用锤子切割火鸡:这不是使用正则表达式的情况。@balpha,+1!你应该改为使用XML解析器。这就解决了我的问题!但是是的,你是对的,我不是很精确。碰巧的是,它并不总是a_1,它可能是a_2或更多。即使有时没有任何东西,这个词的前缀也会是DN:,比如{DN:saddelmageri}。我想你是对的,使用XML解析器一定更容易。这就解决了我的问题!但是是的,你是对的,我不是很精确。碰巧的是,它并不总是a_1,它可能是a_2或更多。即使有时没有任何东西,这个词的前缀也会是DN:,比如{DN:saddelmageri}。我想你是对的,使用XML解析器一定更容易。