Regex 如何捕获匹配组(嵌套正则表达式)中字符串的多次出现

Regex 如何捕获匹配组(嵌套正则表达式)中字符串的多次出现,regex,python-3.x,Regex,Python 3.x,我想解析(当然)具有嵌套结构的XML文件: <begin> <Paket> <Name>Kwertzu</Name> <Funktion><Kurzbezeichnung>Glubub</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion> <Funktion><Kurzbezeichnung>G

我想解析(当然)具有嵌套结构的XML文件:

<begin>
<Paket>
<Name>Kwertzu</Name>
<Funktion><Kurzbezeichnung>Glubub</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
<Funktion><Kurzbezeichnung>Gwertzu</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
<Funktion><Kurzbezeichnung>Klu_gulbi</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
<Funktion><Kurzbezeichnung>QWER_TZU_ewrt</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
<Funktion><Kurzbezeichnung>MERM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
</Paket>
<Paket>
<Name>KULU</Name>
<Funktion><Kurzbezeichnung>GLM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
<Funktion><Kurzbezeichnung>IWUS_asd</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
<Funktion><Kurzbezeichnung>PLUM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
</Paket>
</begin>

克维特祖
葡萄糖含量
格韦特苏内
Klu_Gulbient
内容
含金量
库鲁
GLM内容
IWUS_ASD内容
丰满的
我有兴趣得到的名称和所有内容的

我试过:
r'\s*(\w*).*(?:(.*).*?*),re.s
这只返回中的最后一个条目,但是。。。
有人能帮忙吗?

我明白为什么XML解析很难,花了我一点时间!以下是您想要的工作示例:

import xml.etree.ElementTree as ET

def main ():
    data = '''<begin>
    <Paket>
    <Name>Kwertzu</Name>
    <Funktion><Kurzbezeichnung>Glubub</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    <Funktion><Kurzbezeichnung>Gwertzu</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    <Funktion><Kurzbezeichnung>Klu_gulbi</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    <Funktion><Kurzbezeichnung>QWER_TZU_ewrt</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    <Funktion><Kurzbezeichnung>MERM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    </Paket>
    <Paket>
    <Name>KULU</Name>
    <Funktion><Kurzbezeichnung>GLM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    <Funktion><Kurzbezeichnung>IWUS_asd</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    <Funktion><Kurzbezeichnung>PLUM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
    </Paket>
    </begin>'''

    root = ET.fromstring(data)
    for child1 in root:
        for child2 in child1:
            if child2.tag == "Name":
                print (child2.text)
            if child2.tag == "Funktion":
                for child3 in child2:
                    if child3.tag == "Kurzbezeichnung":
                        print (child3.text)

main ()
基本上是制作一个可以迭代的对象。重点是:

使用.tag——这就是节点

使用.text——这是节点中的值


希望这有帮助

由于我的示例过于简化,“真实”XML看起来更像这样:

<MyList xmlns="http://www.example.com">
  <FirstTag>
    <Name>Group</Name>
    <SecondTag>
      <Name>DCT23335.7</Name>
      <ThirdTag>
        <Name>AnotherName</Name>
        <Paket>
            <Name>Kwertzu</Name>
            <Funktion><Kurzbezeichnung>Glubub</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
            <Funktion><Kurzbezeichnung>Gwertzu</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
            <Funktion><Kurzbezeichnung>Klu_gulbi</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
            <Funktion><Kurzbezeichnung>QWER_TZU_ewrt</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
            <Funktion><Kurzbezeichnung>MERM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
        </Paket>
        <Paket>
            <Name>KULU</Name>
            <Funktion><Kurzbezeichnung>GLM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
            <Funktion><Kurzbezeichnung>IWUS_asd</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
            <Funktion><Kurzbezeichnung>PLUM</Kurzbezeichnung><OtherTag>content</OtherTag></Funktion>
        </Paket>
      </ThirdTag>
    </SecondTag>
  </FirstTag>
</MyList>

团体
DCT23335.7
另一个名字
克维特祖
葡萄糖含量
格韦特苏内
Klu_Gulbient
内容
含金量
库鲁
GLM内容
IWUS_ASD内容
丰满的
因此,您必须通过编码与名称空间和XML的疯狂嵌套特性作斗争:

root = ET.fromstring(data)

ns = {'ns': re.findall(r'<MyList xmlns="([^"]*)"', data)[0]}
dict_elements = {}
outer_elements = root.find('ns:FirstTag', ns).find('ns:SecondTag', ns).find('ns:ThirdTag', ns).findall('ns:Paket', ns)

for outer_element in outer_elements:
    outer_element_name = outer_element.find('ns:Name', ns).text
    inner_elements = outer_element.findall('ns:Funktion', ns)
    for inner_element in inner_elements:
        dict_elements[inner_element.find('ns:Kurzbezeichnung', ns).text] = outer_element_name
root=ET.fromstring(数据)

ns={'ns':re.findall(你试过使用XML解析器吗?它可能比正则表达式好(尽管我很喜欢它们!)实际上,我已经尝试过了,但是使用它失败了。尽管阅读了很多关于结构的内容,我还是无法从XML中提取必要的标记。我用两个嵌套的正则表达式搜索解决了这个问题(首先搜索外部标签,然后搜索匹配的内部标签。这是可行的,但我认为这将比组合搜索慢得多…感谢您的帮助。由于我总是简化发布示例,因此代码在我的设置中不起作用,我不得不对其进行大量更改。主要问题是隐藏的namespaces…酷。如果你确实觉得我的答案很有用,尽管我希望它被接受:)当然,没问题。我是新来的,所以我不知道我可以/应该这样做。我甚至提供了我的解决方案,我以你的例子为起点创建了该解决方案。但是,由于“来自我所在地的垃圾邮件”,我不允许发布该解决方案:-(
root = ET.fromstring(data)

ns = {'ns': re.findall(r'<MyList xmlns="([^"]*)"', data)[0]}
dict_elements = {}
outer_elements = root.find('ns:FirstTag', ns).find('ns:SecondTag', ns).find('ns:ThirdTag', ns).findall('ns:Paket', ns)

for outer_element in outer_elements:
    outer_element_name = outer_element.find('ns:Name', ns).text
    inner_elements = outer_element.findall('ns:Funktion', ns)
    for inner_element in inner_elements:
        dict_elements[inner_element.find('ns:Kurzbezeichnung', ns).text] = outer_element_name