2013-03-25 67 views
3

我从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+\)永远在最后一个单独。

我会如何区分它们?我在创建代码时遇到问题。

编辑: 我希望即使在分开部分后仍保留分号。

+0

第2组或第3组是否包含'\ r \ n \(%i \ d + \)',或者这是排除在匹配的gro UPS? – woemler 2013-03-25 15:45:35

+0

@willOEM组3将包含该信息。这将是第3组中的唯一项目 – mike 2013-03-25 18:14:32

+0

感谢您的澄清,我已经相应地更新了我的答案。你应该稍微调整一下你的问题的措辞,以使这个晶莹剔透。 – woemler 2013-03-25 18:21:13

回答

2

这应该做你要求的是什么:

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

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

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

你代码的大部分作品,但它分开组后,抛出分号,如何可以我保留分号并仍然将它用作“边界”,它应该保留在第一组中。 – mike 2013-03-25 18:27:37

+0

通过将分号添加到定义第一组的圆括号中,它们不会从匹配的组中排除。当有括号定义匹配组时,它们之外的所有内容都不会被返回。当没有括号时,则返回匹配的正则表达式模式中的每个句柄。 – woemler 2013-03-25 18:33:05

+0

您的编辑按预期工作。 – mike 2013-03-25 18:40:45

1

我不知道你需要的正则表达式是:

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) ') 
+0

极简主义的方法当然是不错的,但我需要分号, – mike 2013-11-04 20:24:27