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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:27:43