如何使用REGEX匹配首个标记第二次出现位置与第二个标记之间的数据
问题原因
你的代码不符合预期有两个核心原因:
- 正则中
.默认不匹配换行符,无法识别XML中跨多行的标签内容 - 你的XML存在两层同名的
<Address item="1">嵌套标签,原有正则会匹配到外层的起始标签,惰性匹配到第一个闭合标签时就返回,因此带了不需要的其他标签内容。
解决方案
方案1:修正正则规则(适合临时快速处理)
直接匹配内容不含其他标签的内层Address节点即可,不需要额外开启跨行匹配:
import re # [^<]+ 匹配所有不含左尖括号的内容,自动避开嵌套标签 address_pattern = r'<Address item="1">([^<]+)</Address>' cks_config = re.search(address_pattern, data).group(1).strip() print(cks_config)
如果要严格匹配IP格式,可以把规则改成:address_pattern = r'<Address item="1">(\d{1,3}(?:\.\d{1,3}){3})</Address>'
方案2:使用XML解析库(更稳定,推荐)
正则处理XML很容易因为格式变动、嵌套变化出问题,用Python内置的XML解析器更稳妥:
import xml.etree.ElementTree as ET root = ET.fromstring(data) # 遍历所有Address节点,取文本内容为IP的节点值 for addr_node in root.iter('Address'): node_text = addr_node.text.strip() if addr_node.text else '' if '.' in node_text: cks_config = node_text break print(cks_config)
内容的提问来源于stack exchange,提问作者Surendranatha Reddy T
相关产品推荐
相关产品推荐

