You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python正则替换问题:如何在指定位置插入UK/并跳过连字符

问题描述

给定输入字符串 Input = Street1-2,4,6,8-10,需要实现以下替换规则:

  • Street后插入UK/
  • 在每个逗号,后插入UK/
  • 连字符-保持不变,无需处理

预期输出结果:StreetUK/1-2,UK/4,UK/6,UK/8-10

但当前使用的正则表达式无法捕获所有需要替换的位置,现有代码仅输出['StreetUK/'],无法达到预期效果。现有代码如下:

import re

replacements = []
pattern = r"(Street)?(?:\d+)(((,)?(?:\d+))*[-]?(?:\d+))*"

def replacement(x):
    replacements.append(f"{x.group(1)}{'UK'}/")

input = 'Street1-2,4,6,8-10'
m = re.sub(pattern, replacement, input)
print(m, [''.join(x) for x in replacements] )
解决方案

原正则的问题在于试图一次性匹配整个字符串,而非定位所有需要插入UK/的触发位置。我们可以直接匹配两个关键触发点Street的末尾、每个逗号的后方,以此完成精准替换。

正确实现代码

import re

input_str = 'Street1-2,4,6,8-10'
# 匹配两种需要插入的位置:Street后紧跟数字的位置,或逗号之后的位置
pattern = r'(Street)(?=\d)|(?<=,)'
# 根据匹配结果做对应替换
result = re.sub(pattern, lambda x: f"{x.group(1)}UK/" if x.group(1) else "UK/", input_str)

print(result)  # 输出:StreetUK/1-2,UK/4,UK/6,UK/8-10

逻辑说明

  1. 正则表达式解析
    • (Street)(?=\d):捕获Street,同时通过正向预查(?=\d)确保它后面紧跟数字,不会误匹配其他场景下的Street,精准定位Street后需要插入的位置。
    • (?<=,):通过正向后顾匹配逗号之后的位置,不消耗逗号本身,这样就能在每个逗号后插入UK/
  2. 替换逻辑
    • 用lambda表达式判断匹配项:如果捕获到Street分组,就替换为StreetUK/;如果匹配的是逗号后的位置,就直接替换为UK/

这种方式直接定位所有需要修改的位置,避免了原正则一次性匹配整个字符串的错误逻辑,能精准完成所有替换需求。

内容的提问来源于stack exchange,提问作者Sunil Bojanapally

火山引擎 最新活动