【问题标题】:python replace string at 2 parts in one line [duplicate]python在一行中的2个部分替换字符串[重复]
【发布时间】:2026-01-05 16:40:01
【问题描述】:

源字符串:“LTRIM(RTRIM(AB.ITEM_ID)) AS ITEM_NUMBER,

将 LTRIM RTRIM 转换为 TRIM 并删除多余的右括号。 我需要将其转换为“ TRIM(AB.ITEM_ID) AS ITEM_NUMBER,

有许多 sql 文件,这些文件很长,需要作为平台迁移的一部分进行更正。 这个源字符串在每个 sql 中可能有很多地方。 我尝试做 line.replace('LTRIM(RTRIM', 'TRIM') 作品,但留下了额外的右括号。 我也希望一次性移除额外的支架 样本输入:

1.REPLACE(LTRIM(RTRIM(NVL(AB.ITEM_SHORT_DESC,AB.ITEM_DESC))),',','') AS SHORT_DESC

2.LTRIM(RTRIM(AB.ITEM_ID))** AS ITEM_NUMBER,**

请注意,输入是一个完整的字符串文件,可以多次出现,而不仅仅是一行,此 LTRIM(RTRIM 。当然必须使用一些正则表达式等。

我正在使用 python 3.8.2

【问题讨论】:

  • Python 在这种情况下没有 AS 运算符? AS 试图完成什么?
  • 这是 VBA 代码吗?还是excel公式?
  • 唯一的问题是你不知道正确的括号在哪里。
  • 您必须使用新的import regex 模块才能使用递归来查找和识别右括号的位置。即使使用递归也只能让你做 outter LTRIM(RTRIM stuff 如果你想做内部的东西,你必须 re-run 上的正则表达式字符串,直到没有 LTRIM(RTRIM 剩下,如果你愿意使用它,我可以给你递归正则表达式。

标签: python regex


【解决方案1】:

您可以使用 Python 替换正则表达式引擎进行递归和
你想要的替代品。

正则表达式r"LTRIM\(RTRIM(\((?:(?>(?!LTRIM\(RTRIM\(|[()])[\S\s])+|\(|(?R))*\))\)"
替换为r"TRIM\1"

样本

import regex

src = '''
.. LTRIM(RTRIM(AB.ITEM_ID)) AS ITEM_NUMBER,
 .. REPLACE(LTRIM(RTRIM(NVL(AB.ITEM_SHORT_DESC,AB.ITEM_DESC))),',','') AS SHORT_DESC
.. LTRIM(RTRIM(AB.ITEM_ID))** AS ITEM_NUMBER,**
'''

srcnew = regex.sub(r"LTRIM\(RTRIM(\((?:(?>(?!LTRIM\(RTRIM\(|[()])[\S\s])+|\(|(?R))*\))\)", r"TRIM\1", src)

print( srcnew )

https://repl.it/repls/DelightfulSatisfiedCore#main.py

【讨论】:

  • 非常感谢,有问题,但安装正则表达式后它工作了 $python -m pip install regex
最近更新 更多