获取独立的数字,而不是与数字相关的代码

  • 本文关键字:数字 代码 独立 获取 regex
  • 更新时间 :
  • 英文 :


我是regex的新手,在以下问题上,我花了大量时间在regex测试仪上进行实验,搜索网络等。我使用的是Python 3.7+.

示例文本字符串:

((AC00001234+AC00005678(/365(*(5+10(

注意-AC始终是大写的,后面正好跟有8位数字。

预期结果:一组符合以下项目的患者。更具体地说,任何和所有不带AC前缀的数字。

  • 365
  • 5
  • 10

虽然我尝试的事情多得数不清,但我最接近的是消极的落后(下图(。问题是,结果也拉入了00001234和00005678。我尝试过显式字符类[0-9],调整一些分组等。

当前代码:

(?<!AC\d{8}(\d+

当前结果:

  • 00001234
  • 00005678
  • 365
  • 5
  • 10

关于堆栈溢出,我看到了以下内容:带有可选前缀的正则表达式中的负查找,不在字符串前面或后面的匹配模式,独立数字regex?,和Regex来识别独立号码。

为了简单起见,我将解析分解为其他三个步骤(例如,仅提取AC前缀代码、数学运算符等(,这是我需要解决的最后一个步骤。

显而易见的方法是:(?<!AC)d+-一组前面没有AC的数字。然而,这失败了,因为它匹配0001234,因为它前面是0,而不是AC。缺失的部分是,你还必须断言它前面没有数字:

(?<!AC)(?<!d)d+

根据可能的输入字符串,单词边界断言也可以做类似的工作:

(?<!AC)bd+

您的代码((?<!ACd{8})d+(失败,因为它意味着";不在CCD_ 7之前的一组数字(其中X是数字(。AC00001234前面没有AC和另外八位数字,所以它是匹配的。你可以通过在匹配后断言它来修复它:d+(?<!ACd{8}),但由于类似的原因失败了——它将取消00001234的资格,但它不会取消0000123的资格,因为没有AC,它的末尾前面有八位数字——只有七位!所以你仍然需要一个边界断言:

d+(?<!ACd{8})b

但是,这比前两个解决方案不太清楚(还需要知道ACXXXXXXXX字符串的长度(。

最新更新