我一直试图用regex解析包裹号,但遇到了一些问题。我从这个开始:
r'(?<=[":#][\s\n])(\d{2}[-:\s]*\d{2}[-:\s]*\d{3}[-:\s]*\d{3}(?:\-{1}\d{4})?)'
通过查看后面以确保我没有意外返回10位或14位长度的电话号码或内部文件号码。结果发现,一个列表可能包含多个由任意数量的字符(空格、and、/、&;等)分隔的包裹号(最多40+)。所以我就把后面的部分剪掉,这样处理:
r'\d{2}[-:\s]*\d{2}[-:\s]*\d{3}[-:\s]*\d{3}(?:[-:\s]*\d{4}$)?'
但在一个例子中:
#22-33-155-003 NKA 22-33-155-009。。。。。。高/宽#41877 1021690 UPAXLP
结果是:
['22-33-155-009', '22-33-155-003', '1877 102169']
我试过在开头加上^
,在结尾加上$
,以防止最后一位(41877 1021690 UPAXLP)返回“1877 102169”,但是它什么也不返回。你知道吗
每个清单都来自不同的来源,其显示包裹编号的格式不同,唯一可靠的方法是识别10位模式,可能的字符(-、/、空格等)分隔,并使用后/前看确保它实际上是包裹编号。你知道吗
我的问题是:
1)我如何在考虑几个包裹被几个可能的字符分隔的可能性时保持向前/向后看?你知道吗
2)如果使用分隔字符,我如何强制它在整个过程中都被使用?所以12-34-567-890
或12 34 567 890
而不是1234 567890
或12-34:567 890
,这将阻止上面显示的最后一个示例。你知道吗
3)有没有更好的方法?你知道吗
可以使用lookback强制使用相同的分隔字符:
我想这个正则表达式和你描述的模式是一致的。我使用了您自己的正则表达式,添加了分隔符特性,并删除了“$”。我认为“$”把工作搞砸了。。。你知道吗
相关问题 更多 >
编程相关推荐