首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蟒蛇负向后的奇数行为

蟒蛇负向后的奇数行为
EN

Stack Overflow用户
提问于 2015-09-17 13:03:01
回答 2查看 64关注 0票数 3

我正在尝试使用一个正则表达式来做一个re.split,这个正则表达式利用的是后视镜。我想在没有\r前面的换行符上拆分。更复杂的是,如果它前面有某个子字符串: XYZ,我也不想在\n上拆分。

我可以通过安装regex模块来解决我的问题,该模块允许我在后面设置可变宽度组。不过,我尽量避免安装任何东西。

我的工作准则看起来是:

代码语言:javascript
复制
regex.split("(?<!(?:\r|XYZ))\n", s)

还有一个示例字符串:

代码语言:javascript
复制
s = "DATA1\nDA\r\n \r\n \r\nTA2\nDA\r\nTA3\nDAXYZ\nTA4\nDATA5"

当斯普利特看起来是:

代码语言:javascript
复制
['DATA1', 'DA\r\n \r\n \r\nTA2', 'DA\r\nTA3', 'DAXYZ\nTA4', 'DATA5']

在没有regex模块的情况下,我最近的非工作表达式:

代码语言:javascript
复制
re.split("(?<!(?:..\r|XYZ))\n", s)

但这种分裂的结果是:

代码语言:javascript
复制
['DATA1', 'DA\r\n \r', ' \r', 'TA2', 'DA\r\nTA3', 'DAXYZ\nTA4', 'DATA5']

而这我不明白。根据我对“后看”的理解,这最后一句应该行得通。你知道如何用基re模块来完成这个任务吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-17 13:09:22

您可以使用:

代码语言:javascript
复制
>>> re.split(r"(?<!\r)(?<!XYZ)\n", s)
['DATA1', 'DA\r\n \r\n \r\nTA2', 'DA\r\nTA3', 'DAXYZ\nTA4', 'DATA5']

在这里,我们将您的查找后断言分解为两个断言:

代码语言:javascript
复制
(?<!\r)  # previous char is not \r
(?<!XYZ) # previous text is not XYZ

由于此错误,Python引擎将不允许(?<!(?:\r|XYZ))在后面查找。

代码语言:javascript
复制
error: look-behind requires fixed-width pattern
票数 1
EN

Stack Overflow用户

发布于 2015-09-17 13:10:52

你可以用re.findall

代码语言:javascript
复制
>>> 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贪婪地匹配,如果要匹配的字符不是这两个字符中的字符,则控制权转移到.,即.,它将匹配任何字符,但不匹配换行。非捕获组之后的+将重复整个模式一次或多次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32630997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档