Python正则表达式问题:UOM无后续字符时被错误拆分
问题描述
我需要清理一份存在UOM(单位)与物品名称连写情况的文件。编写了匹配UOM及其变体的正则表达式,单独使用时可完美捕获所有UOM;但将其与其他部分组合以添加应有的空格时,除了字符串仅为UOM的情况(如下例中的前2种情况)外,其余均可正常工作。
代码示例
import re uom_regex = 'box(?:es)?|bxs|bag(?:s)?' regex = r'({0})([a-zA-Z]+)'.format(uom_regex) test_strings = ["boxes", "bags", "boxesapple", "boxapple", "bagapple", 'bagsapple'] for test_string in test_strings: result = re.sub(regex, r'\1 \2', test_string) print(f"Original: {test_string}") print(f"Modified: {result}\n")
当前输出
Original: boxes Modified: box es Original: bags Modified: bag s Original: boxesapple Modified: boxes apple Original: boxapple Modified: box apple Original: bagapple Modified: bag apple Original: bagsapple Modified: bags apple
预期输出(前2种情况)
Original: boxes Modified: boxes Original: bags Modified: bags
如何修改正则表达式,避免在第二个捕获组无内容可匹配时错误拆分UOM?
解决方案
原正则的第二个捕获组([a-zA-Z]+)要求至少匹配一个字母,当字符串本身是完整UOM时,正则会优先匹配UOM的前缀部分(比如box匹配boxes的前3个字符),剩余字符被第二个捕获组捕获,导致错误拆分。
修改方案
通过正向预查确保UOM后面确实存在物品名称的字母,只有满足这个条件时才执行拆分替换。修改后的代码如下:
import re uom_regex = 'box(?:es)?|bxs|bag(?:s)?' # 正向预查(?=[a-zA-Z])确保UOM后有至少一个字母,避免单独UOM被拆分 regex = r'({0})(?=[a-zA-Z])([a-zA-Z]+)'.format(uom_regex) test_strings = ["boxes", "bags", "boxesapple", "boxapple", "bagapple", 'bagsapple'] for test_string in test_strings: result = re.sub(regex, r'\1 \2', test_string) print(f"Original: {test_string}") print(f"Modified: {result}\n")
效果验证
修改后运行代码,输出符合预期:
- 单独的UOM字符串(
boxes、bags)不会被拆分,保留原样 - UOM与物品名称连写的字符串(
boxesapple等)会正确在UOM和名称之间添加空格
内容的提问来源于stack exchange,提问作者Haider Khan
相关产品推荐
相关产品推荐

