我是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字符串的长度(。