使用正则表达式从字符串中提取ICCID

时间:2016-09-23 12:37:42

标签: python regex string iccid

我试图返回并在设备中打印SIM卡的ICCID; SIM卡来自不同供应商,因此长度不同(19或20位)。因此,我正在寻找一个能够提取ICCID的正则表达式(以一种与其周围的非单词字符无关的方式)。

鉴于ICCID指定为以" 89"开头的19-20位数字符串,我只是选择了:

(89\d{17,18})

这是我测试过的最成功的模式(以及由于以下原因而被拒绝的一些模式)。

在我从中提取它的字符串中,ICCID后面会立即返回一个回车符,然后是换行符,但是有些测试不会使用\r\n来终止它,甚至\b都无法工作(我使用的程序是基于python构建的内部程序,因此我怀疑它是用于正则表达式的内容)。此外,简单地使用(\d{19,20})最终提取20位ICCID的最后19位数(作为第三个和最后一个有效匹配)。同样,我原则上排除了(\d{19,20})?,因为我希望在找到前19位数时完成。

所以我的问题是:我应该使用我选择过的模式,还是有更好的表达方式(不使用非单词字符来构建字符串)将返回最长的模式可变长度数字字符串的子字符串?

3 个答案:

答案 0 :(得分:1)

我去了

89\d{17,18}[^\d]

这应该更喜欢18位,但17也足够了。之后,不再允许其他数字字符。

唯一的限制:在ICCID之后必须至少再增加一个字符(这应该与你所描述的一样)。

请注意,任何更长的数字序列都会带有" 89"其次是17或18个数字字符也会匹配。

答案 1 :(得分:1)

如果幕后引擎真的是Python,并且你需要提取的值周围可能有任何非数字字符,请使用lookarounds来限制值的上下文:

Baz

<add key="Umbraco.ModelsBuilder.Enable" value="true" /> <add key="Umbraco.ModelsBuilder.ModelsMode" value="Dll" /> loobehind将需要在比赛前缺少一个数字,(?<!\d)89\d{17,18}(?!\d) ^^^^^^^ ^^^^^^ 否定前瞻将要求在该值之后缺少数字。

请参阅this regex demo

答案 2 :(得分:0)

(\d+)\D+ 
似乎很容易就能做到这一点。 (\ d +)将捕获20个数字。 \ D +之后会匹配其他任何东西。