Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在ReEX文件中忽略一个XML标签(使用非捕获组?)_Python_Xml_Regex_Beautifulsoup - Fatal编程技术网

Python 在ReEX文件中忽略一个XML标签(使用非捕获组?)

Python 在ReEX文件中忽略一个XML标签(使用非捕获组?),python,xml,regex,beautifulsoup,Python,Xml,Regex,Beautifulsoup,我有一个带有嵌入标记的xml,我想捕获除FType标记之外的所有内容。。。 在python正则表达式中 <xml> <EType> <E></E> <F></F> <FType><E1></E1><E2></E2></FType> <FType><E1></E1><E2></E2></FT

我有一个带有嵌入标记的xml,我想捕获除FType标记之外的所有内容。。。 在python正则表达式中

<xml>
<EType>
<E></E>
<F></F>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<G></G>
</EType>
</xml>

我试过:

(?P<xml>.*(?=<FType>.*<FType>).*)
(?P.*(=.*))
但它给了我一切-(

我期望:

<xml>
<EType>
<E></E>
<F></F>
<G></G>
</EType>
</xml>

不需要正则表达式:

In [1]: x = '''    
<xml>
<EType>
<E></E>
<F></F>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<G></G>
</EType>
</xml>'''

In [2]: y = '\n'.join([tag for tag in x.split() if not tag.startswith('<FType>')])

In [3]: print y
<xml>
<EType>
<E></E>
<F></F>
<G></G>
</EType>
</xml>
[1]中的
:x=''
'''
在[2]中:y='\n'.join([x.split()中的标记,如果不是tag.startswith(''))
在[3]中:打印y

不需要正则表达式:

In [1]: x = '''    
<xml>
<EType>
<E></E>
<F></F>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<FType><E1></E1><E2></E2></FType>
<G></G>
</EType>
</xml>'''

In [2]: y = '\n'.join([tag for tag in x.split() if not tag.startswith('<FType>')])

In [3]: print y
<xml>
<EType>
<E></E>
<F></F>
<G></G>
</EType>
</xml>
[1]中的
:x=''
'''
在[2]中:y='\n'.join([x.split()中的标记,如果不是tag.startswith(''))
在[3]中:打印y
单向使用:

它产生:

<?xml version="1.0" encoding="utf-8"?>
<xml>
 <EType>
  <E/>
  <F/>
  <G/>
 </EType>
</xml>

单向使用:

它产生:

<?xml version="1.0" encoding="utf-8"?>
<xml>
 <EType>
  <E/>
  <F/>
  <G/>
 </EType>
</xml>

您的表达式至少有四个问题

首先,您要在一个大组中捕获从
的所有内容。这意味着,如果您设法排除FType位,您将一无所获;如果您不排除FType位,您将获得所有内容。如果您创建三个单独的组,并使中间的一个不捕获,则可以排除中间的一个

其次,您试图排除从
的所有内容,这是行不通的。结束标记是

第三,您在任何地方都使用贪婪匹配,因此即使前两个匹配正确,您也要将所有内容匹配到最后一个FType,包括任何早期FType

总而言之:

>>> re.match(r'(?P<xml>.*?)(?:<FType>.*</FType>)(.*)', s, re.DOTALL).groups()
('<xml>\n<EType>\n<E></E>\n<F></F>\n', '\n<G></G>\n</EType>\n</xml>\n')
>>re.match(r'(?P.*)(:.*)(.*),s,re.DOTALL.groups()
('\n\n\n','\n\n\n\n')
如果您将连接在一起,或将子连接到r'\1\2'等,您将获得所需的输出

第四,这当然是非常脆弱的。但是,用regexps解析像XML这样的非常规语言肯定是非常脆弱的(或者非常复杂,有时速度非常慢),这就是为什么你不应该这么做。但这正是你所要求的


如果你想把它用于,或者,这可能对你没有多大帮助。

你的表达式至少有四个问题

首先,您要在一个大组中捕获从
的所有内容。这意味着,如果您设法排除FType位,您将一无所获;如果您不排除FType位,您将获得所有内容。如果您创建三个单独的组,并使中间的一个不捕获,则可以排除中间的一个

其次,您试图排除从
的所有内容,这是行不通的。结束标记是

第三,您在任何地方都使用贪婪匹配,因此即使前两个匹配正确,您也要将所有内容匹配到最后一个FType,包括任何早期FType

总而言之:

>>> re.match(r'(?P<xml>.*?)(?:<FType>.*</FType>)(.*)', s, re.DOTALL).groups()
('<xml>\n<EType>\n<E></E>\n<F></F>\n', '\n<G></G>\n</EType>\n</xml>\n')
>>re.match(r'(?P.*)(:.*)(.*),s,re.DOTALL.groups()
('\n\n\n','\n\n\n\n')
如果您将连接在一起,或将子连接到r'\1\2'等,您将获得所需的输出

第四,这当然是非常脆弱的。但是,用regexps解析像XML这样的非常规语言肯定是非常脆弱的(或者非常复杂,有时速度非常慢),这就是为什么你不应该这么做。但这正是你所要求的


如果你想用这个,或者,这可能不会对你有多大帮助。

在阅读了你更新的问题和所有其他答案后,我想
你为什么要匹配?

您可以使用replace函数删除

import re

string = "<xml>\
<EType>\
<E></E>\
<F></F>\
<FType><E1></E1><E2></E2></FType>\
<FType><E1></E1><E2></E2></FType>\
<FType><E1></E1><E2></E2></FType>\
<G></G>\
</EType>\
</xml>"

result = re.sub(r'(?i)<ftype>.*?</ftype>[\r\n]*', r'', string)

print result.replace("<", "&lt;").replace(">", "&gt;<br>") # the replace function is just for the output
重新导入
字符串=”\
\
\
\
\
\
\
\
\
"
结果=re.sub(r'(?i)。*?[\r\n]*',r'',字符串)
打印结果。替换(“,”
”)#替换功能仅用于输出
说明:

  • (?i)
    :启用
    i
    修饰符匹配不区分大小写
  • :匹配
  • *?
    :匹配所有未冻结的内容,直到
  • :匹配
  • [\r\n]*
    :匹配
    \r
    \n
    零次或多次

在阅读了您更新的问题和所有其他答案后,我想
您为什么要匹配?

您可以使用replace函数删除

import re

string = "<xml>\
<EType>\
<E></E>\
<F></F>\
<FType><E1></E1><E2></E2></FType>\
<FType><E1></E1><E2></E2></FType>\
<FType><E1></E1><E2></E2></FType>\
<G></G>\
</EType>\
</xml>"

result = re.sub(r'(?i)<ftype>.*?</ftype>[\r\n]*', r'', string)

print result.replace("<", "&lt;").replace(">", "&gt;<br>") # the replace function is just for the output
重新导入
字符串=”\
\
\
\
\
\
\
\
\
"
结果=re.sub(r'(?i)。*?[\r\n]*',r'',字符串)
打印结果。替换(“,”
”)#替换功能仅用于输出
说明:

  • (?i)
    :启用
    i
    修饰符匹配不区分大小写
  • :匹配
  • *?
    :匹配所有未冻结的内容,直到
  • :匹配
  • [\r\n]*
    :匹配
    \r
    \n
    零次或多次

在python正则表达式中
请使用解析器。您“想要”除了“<代码> <代码>标签外,但看到XML结构,<代码> <代码>是<代码> <代码>标签和<代码> <代码>标签的一部分。逻辑上它将包含在您的结果中。请给我们展示预期的结果。此外,为了省去一些麻烦,您可以考虑适当的解析器……我使用Python ReGEX,因为我需要。这是用于splunk搜索字符串的…我已更新了预期结果,谢谢。您更新的预期结果显然是空字符串。为此,我将匹配python正则表达式中的表达式
r'
。。请使用解析器。您“想要”除了<代码> <代码>标签之外的所有东西,但是看到你的XML结构,<代码> <代码>是<代码> <代码>标签和<代码> <代码>标签的一部分。逻辑上它将包含在你的结果中。请给我们展示预期的结果。