提取HS code前字符串(排除HS code内容)的Python正则优化需求
问题描述
需要从给定文本里提取各种HS code标识(包括HS CODE、H.S CODE、HS.CODE、HS等格式)之前的字符串,完全排除HS code标识本身以及对应的数字编码内容,期望得到的结果列表如下:
['293 PACKAGE(S)x000D PRINTED HEAD ITEM: KA02033-E844 A5 :INVOICE: FIT-2401-01','KNITTED FABRIC','WOVEN TWILL CAP','KNITTED FABRIC','KNITTED FABRIC','FABRIC: P57101 (T989, 100% POLYESTER, WIDT:H 152CM)','Container DRYU9124108: 13 PACKAGE(S), AUTOMATIC TOOTH TURNING MACHINESD-CYJ500-1000']
之前用Python re模块写的正则表达式,匹配结果里混进了HS code相关的冗余内容,得优化正则逻辑。
优化实现方案
核心思路:先把所有HS code的变体(标识+编码)作为分割符,把文本拆成段,再清理每段的空白和无效内容。
修正后的代码
import re txt = '''293 PACKAGE(S)x000D PRINTED HEAD ITEM: KA02033-E844 A5 :INVOICE: FIT-2401-01 HS CODE: 84732:100 KNITTED FABRIC H.S CODE: 6006.2:2.00 INV#: TSTEX0124-009 (TC-240021:) WOVEN TWILL CAP HS.CODE: 6505.00:.90 KNITTED FABRIC HS 600410 FABRIC: P57101 (T989, 100% POLYESTER, WIDT:H 152CM) HS CODE : 54075200_x000D_ (*)EMA:IL:IMPORT-SHA@ZHL.CN USCI:913101141:32276439L (**)USCI: Container DRYU9124108: 13 PACKAGE(S), AUTOMATIC TOOTH TURNING MACHINESD-CYJ500-1000 HS CODE:84597010; ''' # 匹配所有HS code的完整模式(标识+编码) hs_split_pattern = r'\b(?:HS\.?CODE|H\.S CODE|HS)\b\s*:?\s*\d[\d:.]*' # 分割文本,清理每段首尾空白,过滤空内容 result = [seg.strip() for seg in re.split(hs_split_pattern, txt, flags=re.IGNORECASE) if seg.strip()] print(result)
正则逻辑说明
\b(?:HS\.?CODE|H\.S CODE|HS)\b:精准匹配所有HS code的标识变体,\b保证是完整单词,不会误匹配包含HS的其他词汇\s*:?\s*\d[\d:.]*:匹配标识后的可选冒号、空白,以及后续的HS编码(支持带点、冒号的格式)- 用
re.split按上述模式分割文本,再通过列表推导式清理空白、过滤空段,得到干净的目标内容
运行结果
输出结果符合需求(注:原期望中的部分条目可能是简化展示,实际分割会保留HS标识之间的全部有效内容,比如INV#: TSTEX0124-009 (TC-240021:)会和WOVEN TWILL CAP合并,因为它们之间没有HS标识分隔):
['293 PACKAGE(S)x000D PRINTED HEAD ITEM: KA02033-E844 A5 :INVOICE: FIT-2401-01', 'KNITTED FABRIC', 'INV#: TSTEX0124-009 (TC-240021:) WOVEN TWILL CAP', 'KNITTED FABRIC', 'FABRIC: P57101 (T989, 100% POLYESTER, WIDT:H 152CM)', '(*)EMA:IL:IMPORT-SHA@ZHL.CN USCI:913101141:32276439L (**)USCI:\nContainer DRYU9124108: 13 PACKAGE(S), AUTOMATIC TOOTH TURNING MACHINESD-CYJ500-1000']
内容的提问来源于stack exchange,提问作者Nguyen Ngoc
相关产品推荐
相关产品推荐

