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'
解决方案
原写法有两个核心问题:
- 正则把不需要修改的数字部分也纳入了匹配范围,导致替换时连带数字一起改动
- 直接写固定替换字符串,没有对匹配到的字母单独做小写转换
修正思路:
- 用零宽断言定位目标字符的边界,仅匹配需要转小写的字符片段,不把前后的数字、空格等不需要改动的内容纳入匹配范围
- 给
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
相关产品推荐
相关产品推荐

