我想通过正则表达式找到字符串中重复出现的多个相同的 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)
您的问题是您的正则表达式坚持重复出现的标签紧随其后出现(除了一些中间的空格),这对于您的示例数据来说并非如此。如果您更改输入数据,您将获得匹配项:
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
不感兴趣,您也可以使该组不被捕获。
这是一种更简单的方法来匹配您
<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']