如何通过正则表达式在字符串中重复查找相同的xml元素

问题描述 投票:0回答:2

我想通过正则表达式找到字符串中重复出现的多个相同的 xml 元素(但它在 xml 元素中包含不同的值)。 我尝试过,但无法在 python 中找到正确的编码。如何在正则表达式中编写正确的模式。

MWE:

import re
    
xml_data = """
<fp>xxxx</fp>
<fp>xxxxy</fp>
<fp>xxxx</fp>
<fp>yyyy</fp>
"""
    
pattern = re.compile(r'(<fp>(((?!</fp>).)*)</fp>)\s*\1')
matches = pattern.findall(xml_data)
    
for match in matches:
    print("Match:", match)
python regex
2个回答
0
投票

您的问题是您的正则表达式坚持重复出现的标签紧随其后出现(除了一些中间的空格),这对于您的示例数据来说并非如此。如果您更改输入数据,您将获得匹配项:

xml_data = """
<fp>xxxx</fp>
<fp>xxxx</fp>
<fp>yyyy</fp>
"""
    
pattern = re.compile(r'(<fp>(((?!</fp>).)*)</fp>)\s*\1')
matches = pattern.findall(xml_data)

输出:

[('<fp>xxxx</fp>', 'xxxx', 'x')]

或者修改您的正则表达式以允许其他插入字符:

xml_data = """
<fp>xxxx</fp>
<fp>xxxxy</fp>
<fp>xxxx</fp>
<fp>yyyy</fp>
"""
    
pattern = re.compile(r'(<fp>(((?!</fp>).)*)</fp>)[\S\s]*\1')
matches = pattern.findall(xml_data)

输出:

[('<fp>xxxx</fp>', 'xxxx', 'x')]

请注意,您可能不需要内部捕获组,因此您应该将其替换为非捕获组以提高效率:

pattern = re.compile(r'(<fp>((?:(?!</fp>).)*)</fp>)[\S\s]*\1')
matches = pattern.findall(xml_data)

输出:

[('<fp>xxxx</fp>', 'xxxx')]

如果您对

xxxx
不感兴趣,您也可以使该组不被捕获。


0
投票

这是一种更简单的方法来匹配您

<fp></fp>
标签的所有内容,我相信这是您的意图。

import re

xml_string = """
<fp>xxxx</fp>
<fp>xxxxy</fp>
<fp>xxxx</fp>
<fp>yyyy</fp>
"""

pattern = re.compile(r'<fp>(.*?)<\/fp>')
matches = pattern.findall(xml_string)

print(matches)

输出:

['xxxx', 'xxxxy', 'xxxx', 'yyyy']
© www.soinside.com 2019 - 2024. All rights reserved.