【问题标题】:Replacing a string which is divided into 3 parts替换分为三部分的字符串
【发布时间】:2023-02-22 09:51:57
【问题描述】:

我想将 XML 文档中的字符串 <ABCDEF> 替换为字符串 WXYZ(在 XML 文档中,运算符 < 替换为 <,运算符 > 替换为 >)。乍一看,只搜索 <ABCDEF> 的文档似乎很容易

不幸的是,在 XML 文档中,我看到 <ABCDEF 之间以及 ABCDEF> 之间有很多不相关的文本(所以基本上 XML 文档看起来像:<[garbage1]ABCDEF[garbage2]>

现在自然地,为了解决这个问题,我可以将 <[garbage1]ABCDEF[garbage2]> 替换为 WXYZ(这是我到目前为止所做的)。但我担心的是,如果[garbage1][garbage2] 中的文本发生变化,那么我的搜索将失败并且字符串不会被替换。

因此,我想知道是否有办法保证更换 - 因为我正在搜索 <ABCDEF> 是否有办法以某种方式做到这一点?

【问题讨论】:

  • 使用正则表达式正确地完成这种任务是非常困难的。建议使用 XML 解析器进行解析,然后遍历/转换节点,然后再次转储。
  • garbage1garbage2 是否有已知的最小和最大长度?

标签: python regex string


【解决方案1】:

可能有更优雅的方式来做到这一点,但是...... 正则表达式模式将是'<(.*?)ABCDEF(.*?)>' 垃圾被捕获到.group(1).group(2)。看你想留着还是扔掉。

src_text = "<[garbage1]ABCDEF[garbage2]><[gar2]ABCDEF[gar3]><ABCDEF[g5]>"
p = re.compile(r'<(.*?)ABCDEF(.*?)>')
match = re.search(p, src_text)
if not match:
    return
print("result", "<" + match.group(1) + "WXYZ" + match.group(2) + ">")

输出

result <[garbage1]WXYZ[garbage2]>

重复直到不匹配。

【讨论】:

  • 忘记了您可以访问 python 的正则表达式匹配中的特定组。我找到了一个使用 KeepOut 正则表达式的解决方案,但随后发现 python 的默认正则表达式引擎不支持它,它需要使用基于 PCRE 的外部正则表达式库。
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 2013-06-19
  • 2021-03-25
  • 1970-01-01
  • 2022-07-18
  • 2011-09-04
  • 2021-03-01
相关资源
最近更新 更多