繁体   English   中英

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

[英]RegEx/Python: n - occurrences of match before other match

我有这样的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的单词(带注释的标题为“ head”的单词)周围的单词的“ pos”和“ token”的值。

这是17字点之后的所有比赛没有问题。

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

这为我提供了我想要的所有信息,如果我想扩展我可以添加

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

到最后。 它不漂亮,但是可以用。

现在,当我想朝另一个方向走时,我绝对感到沮丧

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

它不仅匹配单词16的信息(“带注释的头部”前面的第一个单词),还匹配之前的所有信息(单词15,单词14,单词13等)。

我想念什么?

PS很遗憾,不能使用XML解析器。

如果您确定数据是格式正确的XML。 我认为可以尝试以下步骤:

step1: <word[^>]*>([^<]*(?:(?!<\\/?word)<[^<]*)*)<\\/word> (请参阅http:// regexr。 com?31org
步骤2:从步骤1(组1)获取字符串,并与<token[^>]*>([^<]*(?:(?!<\\/?token)<[^<]*)*)<\\/token>匹配<token[^>]*>([^<]*(?:(?!<\\/?token)<[^<]*)*)<\\/token> (ref http://regexr.com?31ora )或<lemmas[^>]*>([^<]*(?:(?!<\\/?lemmas)<[^<]*)*)<\\/lemmas> (ref http://regexr.com?31ord

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

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

我认为应该是这样的:

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

结果,组#1将包含id = 16的节点“ word”,而组#2将包含id = 18的节点“ word”。

然后,您可以使用正则表达式分别解析这些节点中的每个节点,如下所示:

(?s)<word[^>]*?pos="(?P<pos>[^"]+).*?<token>(?P<token>[^<]+)

您将获得两组“ pos”和“ token”。

当然可以使用单个正则表达式,但是它会很丑陋。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM