【问题标题】:re match a pattern重新匹配一个模式
【发布时间】:2013-03-26 02:30:46
【问题描述】:

我有一些来自 CAS 的输出,我想将这些内容分成三部分,这里是一些示例输出:

' 1+2;\r\n\r(%o2)                                  3\r\n(%i3) '
'?\r\n\r\n\rpos;\r\n\r(%o1)                                  0\r\n(%i2) '

我想把输出分成三部分:

  1. 从字符串开头到';'的部分分号。
  2. 分号之后到之前结尾的部分\r\n\(%i\d+\)
  3. 最后一部分是单独的,即。\r\n\(%i\d+\) 在最后一部分中始终是单独的。

我将如何将它们分开?我无法创建代码来做到这一点。

编辑: 即使在分隔部分之后,我也希望保留分号。

【问题讨论】:

  • 第 2 组或第 3 组是否会包含 \r\n\(%i\d+\),还是要从匹配组中排除?
  • @willOEM group 3 将包含该内容。这将是第 3 组中唯一的项目
  • 感谢您的澄清,我已相应地更新了我的答案。你应该稍微调整一下你的问题的措辞,让这个问题一目了然。
  • @willOEM 不幸的是英语不是我的第一/唯一语言,但我已经努力,如果它更好,请告诉我。
  • 没问题,尽力而为。你的英语比我擅长任何其他语言:)

标签: python regex


【解决方案1】:

这应该满足您的要求:

re.findall('^([^;]+);(.*)(\r\n\(%i\d+\).+)$', text, re.S)

要在第一组中包含分号,只需将其添加到分组括号中:

re.findall('^([^;]+;)(.*)(\r\n\(%i\d+\).+)$', text, re.S)

【讨论】:

  • 您的代码大部分都可以工作,但是在分隔组后它会丢弃分号,我怎样才能保留分号并仍然将其用作“边界”,它应该保留在第一组中.
  • 通过将分号添加到定义第一组的括号中,它们不会被排除在匹配的组之外。当您有括号定义匹配组时,它们之外的所有内容都不会返回。如果没有括号,则返回正则表达式模式中匹配的所有内容。
【解决方案2】:

我不确定您是否需要正则表达式:

In [31]: s = '?\r\n\r\n\rpos;\r\n\r(%o1)                                  0\r\n(%i2) '

In [32]: p1, _, p23 = s.partition(';')

In [33]: p2, _, p3 = p23.rpartition('\r\n')

In [34]: p1, p2, p3
Out[34]: ('?\r\n\r\n\rpos', '\r\n\r(%o1)                                  0', '(%i2) ')

【讨论】:

  • 极简主义的方法当然不错,但我需要分号,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多