我正在尝试使用一个正则表达式来做一个re.split,这个正则表达式利用的是后视镜。我想在没有\r前面的换行符上拆分。更复杂的是,如果它前面有某个子字符串: XYZ,我也不想在\n上拆分。
我可以通过安装regex模块来解决我的问题,该模块允许我在后面设置可变宽度组。不过,我尽量避免安装任何东西。
我的工作准则看起来是:
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模块来完成这个任务吗?
发布于 2015-09-17 13:09:22
您可以使用:
>>> re.split(r"(?<!\r)(?<!XYZ)\n", s)
['DATA1', 'DA\r\n \r\n \r\nTA2', 'DA\r\nTA3', 'DAXYZ\nTA4', 'DATA5']在这里,我们将您的查找后断言分解为两个断言:
(?<!\r) # previous char is not \r
(?<!XYZ) # previous text is not XYZ由于此错误,Python引擎将不允许(?<!(?:\r|XYZ))在后面查找。
error: look-behind requires fixed-width pattern发布于 2015-09-17 13:10:52
你可以用re.findall
>>> s = "DATA1\nDA\r\n \r\n \r\nTA2\nDA\r\nTA3\nDAXYZ\nTA4\nDATA5"
>>> re.findall(r'(?:(?:XYZ|\r)\n|.)+', s)
['DATA1', 'DA\r\n \r\n \r\nTA2', 'DA\r\nTA3', 'DAXYZ\nTA4', 'DATA5']解释:
(?:(?:XYZ|\r)\n|.)+,这将与XYZ\n或\r\n贪婪地匹配,如果要匹配的字符不是这两个字符中的字符,则控制权转移到.,即.,它将匹配任何字符,但不匹配换行。非捕获组之后的+将重复整个模式一次或多次。
https://stackoverflow.com/questions/32630997
复制相似问题