【发布时间】:2015-09-17 13:03:01
【问题描述】:
我正在尝试使用正则表达式进行 re.split,该正则表达式利用了后视。我想拆分前面没有 \r 的换行符。更复杂的是,如果 \n 前面有某个子字符串,我也不想拆分它:XYZ。
我可以通过安装正则表达式模块来解决我的问题,该模块让我可以在后面进行可变宽度组。但是,我试图避免安装任何东西。
我的工作正则表达式看起来像:
regex.split("(?<!(?:\r|XYZ))\n", s)
还有一个示例字符串:
s = "DATA1\nDA\r\n \r\n \r\nTA2\nDA\r\nTA3\nDAXYZ\nTA4\nDATA5"
拆分时的样子:
['DATA1', 'DA\r\n \r\n \r\nTA2', 'DA\r\nTA3', 'DAXYZ\nTA4', 'DATA5']
没有 regex 模块的我最接近的非工作表达式:
re.split("(?<!(?:..\r|XYZ))\n", s)
但是这种分裂导致:
['DATA1', 'DA\r\n \r', ' \r', 'TA2', 'DA\r\nTA3', 'DAXYZ\nTA4', 'DATA5']
这我不明白。根据我对后面的理解,最后一个表达式应该有效。知道如何使用基本 re 模块来完成此任务吗?
【问题讨论】:
-
真的,您不需要正则表达式模块,请参阅 anubhava 的解决方案。他的解释少了一句:当一个look-behind有一些替代方案时,它们都必须是等宽的。而且你也不能在那里使用反向引用。
标签: python regex lookbehind