【问题标题】:regex to only replace certain patterns in Python正则表达式仅替换 Python 中的某些模式
【发布时间】:2021-04-23 15:28:42
【问题描述】:

在以下示例中,使用 Python 3.8,我希望仅用管道替换 NUMBER(38,0) 中的逗号。

MISC1 VARCHAR, MISC2 VARCHAR, NUMBERS NUMBER(38,0), MISC3 VARCHAR

预期的结果是

MISC1 VARCHAR, MISC2 VARCHAR, NUMBERS NUMBER(38|0), MISC3 VARCHAR

NUMBER(38,0) 可能出现在列表中的任何位置,因此我无法指定第三个逗号,例如,NUMBER(38,0) 可能出现多次。此外,即使括号内的数值发生变化,例如NUMBER(24,2),我也需要能够做到这一点。

我无法想出一个不能替代所有其他逗号的有效解决方案,因此我正在联系蜂巢专家,看看是否有比我更博学的人来解决这个问题。

我一直使用的RE字符串是

([A-Z])\w+\([0-9]+,[0-9]+\)

感谢您的观看。

【问题讨论】:

  • 如果您需要更改NUMBER(xx,x) 的位置...在我看来,您需要搜索NUMBER(,然后找到下一个) 并替换里面的逗号那些索引。从长远来看,这可能比这里的正则表达式更容易维护。

标签: python python-3.x regex


【解决方案1】:
import re

sampleStr = 'MISC1 VARCHAR, MISC2 VARCHAR, NUMBERS NUMBER(38,0), MISC3 VARCHAR NUMBER(24,1)'

sub_sampleStr = re.sub(r'(\(\d+)(,)(\d+\))', r'\1|\3', sampleStr)
print(sub_sampleStr)

输出:

print(sub_sampleStr)
MISC1 VARCHAR, MISC2 VARCHAR, NUMBERS NUMBER(38|0), MISC3 VARCHAR NUMBER(24|1)

【讨论】:

  • 这很有效,我喜欢简单。您能否向我解释一下代码中的 r'\1|\3' 部分,以便我学习变得更好?
  • 是的,这就是分组。与其他解决方案类似,我将第 2 组作为“,”部分。
  • 第 1 组是(38 第 2 组是 ,第 3 组是 0)。所以它基本上是说保留第 1 组和第 3 组并在它们之间放置管道(并且我没有将第 2 组放在替换中)
【解决方案2】:

对于您展示的具体示例,这应该有效:

import re

yourstr = 'MISC1 VARCHAR, MISC2 VARCHAR, NUMBERS NUMBER(38,0), MISC3 VARCHAR'
newstr = re.sub(r'([A-Z]+\([0-9]+),([0-9]+\))', r'\1|\2', yourstr)

这类似于您在问题中显示的表达式。本质上,我们将整个捕获 NUMBER(38,0) 分成两个捕获组:NUMBER(380),用逗号分隔,我们将其替换为 |


如果您想替换括号内任意数量的逗号,那么您可能希望使用 lambda 替换:

newstr = re.sub(r'[A-Z]+\((?:[0-9]+,)*[0-9]+\)', 
                lambda m: m.group(0).replace(',', '|'), 
                yourstr)

它只查找像NUMBER(38,5,6,0) 这样的整个令牌,并将, 替换为| 仅在该令牌内

【讨论】:

  • 完美!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多