You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将字符串列表内匹配正则的字符转为小写

问题背景

现有全大写格式的字符串列表,需要将其中属于计量单位、缩写类的特定字符转换为小写。已编写两个正则规则做匹配:

  • 规则1:匹配数字之间的X
  • 规则2:匹配其余需要处理的目标场景
现存问题

使用re.sub方法时会替换整个匹配到的模式片段(测试中将匹配项替换为"--"),实际需求是仅将正则规则命中的字母部分转换为小写,不改动匹配片段里的数字等其他内容。

测试代码
import re
t1 = 'EXTRUDED PROFILE 50 X 50 MM'
t2 = 'MATERIAL TYPE 3XP WITH A DENSITY OF D= 50KG/M3 AND THICKNESS OF E=8MM'
t3 = 'STEEL TUBE 50X50X3 MM'
list_Txt = [t1, t2, t3]

pattern_X = r'(\d\s?X\s?\d)'
pattern_M = r'(E=|D=)?\s?\d+\s?(X|MM|KG/M)|d+\.(MM)'

new_Txt= [re.sub(pattern_X,'--', item) for item in list_Txt]
运行结果(错误)
'EXTRUDED PROFILE 5--0 MM', 'MATERIAL TYPE 3XP WITH A DENSITY OF D= 50KG/M3 AND THICKNESS OF E=8MM', 'STEEL TUBE 5---- MM'
期望结果
'EXTRUDED PROFILE 50 x 50 mm', 'MATERIAL TYPE 3XP WITH A DENSITY OF d= 50kg/m3 AND THICKNESS OF e=8mm', 'STEEL TUBE 50x50x3 mm'
解决方案

原写法有两个核心问题:

  1. 正则把不需要修改的数字部分也纳入了匹配范围,导致替换时连带数字一起改动
  2. 直接写固定替换字符串,没有对匹配到的字母单独做小写转换

修正思路:

  • 用零宽断言定位目标字符的边界,仅匹配需要转小写的字符片段,不把前后的数字、空格等不需要改动的内容纳入匹配范围
  • 给re.sub传入处理函数,将匹配到的目标片段直接转为小写即可

修正后可运行代码:

import re

t1 = 'EXTRUDED PROFILE 50 X 50 MM'
t2 = 'MATERIAL TYPE 3XP WITH A DENSITY OF D= 50KG/M3 AND THICKNESS OF E=8MM'
t3 = 'STEEL TUBE 50X50X3 MM'
list_Txt = [t1, t2, t3]

def to_lower(match_obj):
    return match_obj.group().lower()

result = []
for text in list_Txt:
    # 1. 匹配数字之间的X,前后数字用零宽断言定位,不纳入匹配
    processed = re.sub(r'(?<=\d)\s*X\s*(?=\d)', to_lower, text)
    # 2. 匹配等号前的D、E(参数前缀),排除其他大写字母
    processed = re.sub(r'(?<![A-Z])[DE](?==)', to_lower, processed)
    # 3. 匹配数字后的计量单位MM、KG/M
    processed = re.sub(r'(?<=\d)(MM|KG/M)', to_lower, processed)
    result.append(processed)

print(result)

运行后输出与期望完全一致,且不会误改3XP这类非计量场景的字符:

['EXTRUDED PROFILE 50 x 50 mm', 'MATERIAL TYPE 3XP WITH A DENSITY OF d= 50kg/m3 AND THICKNESS OF e=8mm', 'STEEL TUBE 50x50x3 mm']

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:55:05