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

Python 使用正则表达式从字符串中提取ICCID,python,regex,string,iccid,Python,Regex,String,Iccid,我试图返回并打印设备中SIM卡的ICCID;SIM卡来自不同的供应商,因此长度不同(19或20位)。因此,我正在寻找一个正则表达式来提取ICCID(以一种与直接围绕它的非单词字符无关的方式) 鉴于ICCID被指定为以“89”开头的19-20位字符串,我只想: (89\d{17,18}) 这是我测试过的最成功的模式(还有一些由于以下原因而被拒绝的模式) 在我从中提取ICCID的字符串中,ICCID后面紧接着一个回车符,然后是换行符,但是一些针对使用\r,\n,甚至\b终止它的测试失败(我正在使用

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

鉴于ICCID被指定为以“89”开头的19-20位字符串,我只想:

(89\d{17,18})
这是我测试过的最成功的模式(还有一些由于以下原因而被拒绝的模式)

在我从中提取ICCID的字符串中,ICCID后面紧接着一个回车符,然后是换行符,但是一些针对使用
\r
\n
,甚至
\b
终止它的测试失败(我正在使用的程序是基于python构建的内部程序,因此我怀疑这就是它在正则表达式中使用的程序)。此外,简单地使用
(\d{19,20})
最终提取了20位ICCID的最后19位数字(作为第三个也是最后一个有效匹配)。同样,我排除了
(\d{19,20})?
原则上,我希望在找到前19位数字时结束

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

我会选择

89\d{17,18}[^\d]
这最好是18位,但17位也足够了。在那之后,不允许再使用其他数字字符

唯一的限制:ICCID后面必须至少还有一个字符(根据您的描述应该可以)


请注意,任何带有“89”后跟17或18个数字字符的更长数字序列也会匹配。

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

(?<!\d)89\d{17,18}(?!\d)
^^^^^^^         ^^^^^^
(?
(?loobhind)将要求在匹配之前缺少一个数字,
(?!\d)
负前瞻将要求在该值之后缺少一个数字


似乎它可以很容易地完成这项任务。(\d+)将捕获20个数字。\d+将匹配之后的任何其他数字。

有很多不同的解决方案。但是这应该足够好。请注意,
Python
提供了
\d
以及
[^\d]
-如果您想允许零个或多个字母,我会选择
\d*
。这实际上取决于要解析的文件/文本的格式。我建议您在regexp测试仪中“调优”表达式,如(使用“g”模式模拟搜索)我不明白为什么
\d{19,20}
只匹配20个字符中的19个-量词是贪婪的。@WiktorStribiżew我怀疑它匹配了前19个数字,然后是所有20个数字,最后19个数字。因为这是它得到的最后一个匹配,所以它返回的是一个。好吧,如果你能提供更多细节,你尝试使用正则表达式的文本示例,什么与你完全匹配获取,也许是工具本身或者它的工作原理,我们可以提供更具体的帮助。
(\d+)\D+