首页 > 解决方案 > 正则表达式到“双重计数”字符

问题描述

给定一个由 0s、1s 和 2s 组成的字符串,例如'0010201': 我想要一个输出,它是任何系列,它是一个被任何数量(包括零)的 0 包围的一个。在这种情况下,所需的输出将是['0010', '01']. 现在,代码re.findall("0*10*", "0010201")将在该输入上正常工作。但是,给定字符串的一部分具有类似1001(两个仅用零分隔)的形式,['100', '1']当我希望它返回时,该正则表达式将返回,['100', '001']这将“双重计算”两个中间的 0。我怎样才能做到这一点?

标签: pythonregexstring

解决方案


您需要一个匹配重叠匹配的正则表达式,但您需要指定自定义左侧边界:它必须需要非0字符或字符串开头。

您可以使用

re.findall(r"(?=(?<!0)(0*10*))", text)

细节

  • (?=- 允许重叠匹配的积极前瞻开始:
    • (?<!0) - 如果在当前位置的左侧紧邻有一个0
    • (0*10*)- 捕获第 1 组(的返回值re.findall):零个或多个0字符,1然后又是零个或多个0字符
  • )- 前瞻结束。

请参阅Python 演示

import re
rx = r"(?=(?<!0)(0*10*))"
print(re.findall(rx, "0010201")) # => ['0010', '01']
print(re.findall(rx, "1001"))    # => ['100', '001']

推荐阅读