【问题标题】:Regex removing certain newlines (Python)正则表达式删除某些换行符(Python)
【发布时间】:2016-05-04 15:32:19
【问题描述】:

我正在寻找一个正则表达式,它允许我在以下行不以数字开头时删除某些“\r\n”字符(或在 Python 中只是 \n)

在 Perl 中,我通过匹配 \r\n(?!\d) 并替换为 \1 来实现这一点(为了不丢失下一行中匹配的字符),但是当我在 Python (\n(?!\d)) 中尝试时,它会删除所有\n 在我的文档中。

【问题讨论】:

  • 您尚未在模式中定义任何捕获组。替换为空字符串。见\r?\n(?!\d) demothis demo 是否按照您的预期工作?
  • 我尝试用空字符串替换,但结果是几乎每个 \n 都从我的文档中删除。我试过那个演示,除非我做错了什么,不幸的是结果是一样的
  • 请粘贴您测试的字符串(作为 Python 变量)和预期结果。我觉得好像你的意图不是你在问题中描述的那样。所有与换行符有关的问题几乎总是由于代码中的一些误解或拼写错误,甚至是检查是否有 CR+LF 或只是 LF 行结尾的问题。有时,编码问题。因此,一些不起作用的代码会很有帮助。
  • 它是否删除了任何后跟数字的换行符?你说它删除了几乎所有的换行符,但我们没有样本数据可供查看。也许应该删除几乎所有的换行符?直到您向我们展示不应该删除的示例,我们才能知道。
  • 抱歉,我正在尝试通过一些示例来复制该问题,因为我不允许粘贴我正在处理的原始数据(由于公司政策)。我已经用演示重新测试了,我得到了我的预期,所以这似乎不是正则表达式的问题,而是我如何应用它(通过文件,逐行,而不是通过字符串变量)

标签: python regex newline


【解决方案1】:

根据您的 cmets,我很确定问题在于您将匹配应用于单个行,而不是一次应用于整个文本。如果换行符是输入字符串中的最后一个字符,则零宽度负前瞻(您正在使用,(?!\d))将成功匹配,如果您的代码逐行运行,情况就是如此。前瞻基本上说“如果后面没有数字则匹配”。如果输入字符串中没有任何内容,这总是正确的。

您无法更改正则表达式来解决此问题。您在一行中检查的任何内容都无法告诉您下一行的内容是什么,因此您需要以某种方式更改周围的代码。一种方法是读取和转换整个文本,而不是一次只读取一行。或者您可以使用 the pairwise recipe from itertools 之类的东西一次检查两行,然后检查第二行以确定是否需要转换第一行。

我还想指出,用\1 代替是不合适的,因为您没有捕获组(模式中的括号是零宽度前瞻语法的一部分,而不是分组语法)。你应该只用一个空字符串替换(这实际上就是你正在做的事情,因为反向引用没有引用任何东西)。

【讨论】:

  • 你是对的,主要的问题是。我一次解析一行,而不是将文件内容解析为一组。我会尝试你关于使用 itertools 中的成对的建议。
猜你喜欢
  • 2011-07-01
  • 2017-02-20
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多