【问题标题】:Regex python - Match newline only if it is followed by number or special character and space正则表达式 python - 仅当它后跟数字或特殊字符和空格时才匹配换行符
【发布时间】:2020-02-03 01:57:36
【问题描述】:

我一直试图在 Python 中找出这个正则表达式,但它没有产生预期的结果。

我有一个我加载的文本文件,格式为:

"18 75 19\n!dont split here\n! but split here\n* and split here"

我想得到以下输出:

['18 75 19\n!dont split here',
 '! but split here',
 '* and split here']

我试图将我的字符串拆分为 1) 一个新行后跟一个数字,或 2) 一个新行后跟一个特殊字符 仅当它后跟一个空格 (例如 '! but split here',但不是 '!dont split here')。

这是我目前所拥有的:

re.split(u'\n(?=[0-9]|([`\-=~!@#$%^&*()_+\[\]{};\'\\:"|<,./<>?])(?= ))', str)

这已经很接近了,但还没有。这是它产生的输出:

['18 75 19\n!dont split here', '!', '! but split here', '*', '* and split here']

它错误地单独匹配特殊字符:'!'和 '*' 有自己的元素。 正则表达式中有两个前瞻运算符。

如果您能帮助确定我可以使用此正则表达式更改哪些内容以使其不匹配单个特殊字符,而仅匹配特殊字符后跟整行,我将不胜感激。

我也愿意接受其他选择。如果有更好的方法不涉及两次前瞻,我也有兴趣了解解决此问题的其他方法。

谢谢!

【问题讨论】:

  • 为什么'18 75 19\n!dont split here'不应该拆分?在这种情况下,换行符不是跟在数字后面吗?我知道! 之后没有空格,但您的第一个条件匹配?:“要么 1)新行后跟数字,要么 2)”
  • @Grismar 我认为它应该是“一个新行后跟 一个数字”
  • 这会更有意义,尽管示例数据没有这种情况 - 但我同意这会起作用。
  • @Nick 已经提供了一个简洁而正确的答案,只是一个备注:不要使用str 作为变量名,因为它会影响 Python 类型str,这将导致所有各种难以发现的问题。要么使用s 之类的东西,或者,如果你坚持使用str,请改用str_

标签: python regex regex-lookarounds positive-lookahead


【解决方案1】:

您的正则表达式实际上正在工作,问题在于您在[`\-=~!@#$%^&amp;*()_+\[\]{};\'\\:"|&lt;,./&lt;&gt;?] 周围拥有的捕获组。来自manual

如果在模式中使用捕获括号,则模式中所有组的文本也会作为结果列表的一部分返回

如果您删除该字符类周围的(),您将获得预期的结果。

请注意,您不需要(?= ),因为它已经是前瞻的一部分,您可以使用(空格)。此外,您可能会发现将符号编写为否定字符类更容易,即

re.split(u'\n(?=[0-9]|[^A-Za-z0-9] )', str)

【讨论】:

  • 非常感谢,尼克 - 这肯定也更具可读性!
  • @RohanMahtani 不用担心 - 我很高兴能提供帮助。
猜你喜欢
  • 2019-09-23
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2012-07-30
  • 2021-11-03
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多