RegEx/Python:n在其他匹配之前出现匹配

2024-09-29 21:44:06 发布

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

我有这样的XML文件结构:

 <word id="15" pos="SS">
          <token>infarto</token>
          <lemmas>infarto</lemmas>
         </word>
         <word id="16" pos="AS">
          <token>miocardico</token>
          <lemmas>miocardico</lemmas>
         </word>
         <word id="17" pos="AS" annotated="head">
          <token>acuto</token>
          <lemmas>acuto</lemmas>
         </word>
         <word id="18" pos="E">
          <token>in</token>
          <lemmas>in</lemmas>
         </word>
         <word id="19" pos="SS">
          <token>corso</token>
          <lemmas>corso</lemmas>
         </word>

我要做的是,获取单词id为17的单词的“pos”和“token”的值(annotated=“head”值)。在

对于第17个单词之后的所有比赛来说,这没有问题。在

^{pr2}$

这可以得到我想要的所有信息,如果我想扩展,我可以添加

(pos=")(.+)(")([\s\S]+?)(token>)(.+)(<)([\s\S]+?)

直到最后。它不漂亮,但很管用。在

现在,当我想去另一个方向时,我完全被难住了

(pos=")(.+)(")([\s\S]+?)(token>)(.+)(<)([\s\S]+?)(pos=")(.+)(")(\s\S+?)("head")

它不是只匹配单词16的信息(注释头部前面的第一个),而是匹配前面的所有信息(单词15、单词14、单词13等)。在

我错过了什么?在

p.S。 遗憾的是,使用XML解析器不是一个选择。在


Tags: postoken信息idasxml单词ss
2条回答

如果您确保数据是格式良好的XML。我认为这是可能的,尝试以下步骤:

步骤1:<word[^>]*>([^<]*(?:(?!<\/?word)<[^<]*)*)<\/word>(refhttp://regexr.com?31org
步骤2:从步骤1(组1)中获取字符串,并与<token[^>]*>([^<]*(?:(?!<\/?token)<[^<]*)*)<\/token>(refhttp://regexr.com?31ora)或{}(refhttp://regexr.com?31ord)匹配

您可以尝试根据您的要求修改这些模式:)

参考文献:掌握正则表达式第三

我想应该是这样的:

(?s)(<word(?:(?!<word).)*)<word[^>]*?annotated="head".*?(<word[^>](?:(?<!</word>).)*)

因此,组1将包含id=16的节点“word”,组2将包含id=18的节点“word”。在

然后可以使用regex分别解析这些节点,如下所示:

^{pr2}$

你将得到两组“pos”和“token”。在

当然,可以使用单个regex,但这将非常难看。在

相关问题 更多 >

    热门问题