0

这是我拥有的字符串(忽略空格)

a = u'(%o3) (9*t*(7*t*(5*t*(3*t^2-1)/2-2*t)/3-3*(3*t^2-1)2)/4-4\r\n*(5*t*(3*t^2-1)2 \r\n-2*t)\r\n/3)\r\n /5\r\n(%i4) '

我将如何将其拆分为如下内容:

b = ['(%o3','(9*t*(7*t*(5*t*(3*t^2-1)/2-2*t)/3-3*(3*t^2-1)2)/4-4\r\n*(5*t*(3*t^2-1)2\r\n-2*t)\r\n/3)\r\n /5','(%i4)' ]

这有点像检查模式 (%o\d+) 和 (%i\d+) 并在它们发生的地方拆分但不会丢失模式本身,a.split(blah) 通常会丢失“blah”。在我的上下文中,“废话”很重要,我不能放弃它。

模式的出现可能超过 2 次,因此我需要将 (%o\d+) 和 (%i\d+) 以及它们之间/之前的任何文本分开。最好的方法是什么?我不确定正则表达式是否可以做到这一点,或者对 text.split 的现有修改不会丢失 split 参数(如果存在)

4

2 回答 2

3

如果您在匹配参数 re.split 周围使用捕获括号,则也返回匹配参数。

print re.split('(\(%[oi]\d+\))', a)

更多信息在这里

于 2013-05-13T15:44:36.053 回答
1

描述

在python中你可以使用

这个链接到正则表达式 (\([%][a-z][0-9]{1,}\))(.*?)(\([%][a-z][0-9]{1,}\))$

当应用于您的字符串时

(%o3)  (9*t*(7*t*(5*t*(3*t^2-1)/2-2*t)/3-3*(3*t^2-1)2)/4-4\r\n*(5*t*(3*t^2-1)2\r\n-2*t)\r\n/3)\r\n /5\r\n(%i4)

产生以下分组匹配

group(0) - the entire string
group(1) - (%o3)
group(2) - (9*t*(7*t*(5*t*(3*t^2-1)/2-2*t)/3-3*(3*t^2-1)2)/4-4\r\n*(5*t*(3*t^2-1)2\r\n-2*t)\r\n/3)\r\n /5\r\n
group(3) - (%i4)

概括

  • (开启第一场小组赛
  • \(需要一个开放的圆括号
  • [%]要求有一个百分号
  • [a-z]需要任何小写字母字符
  • [0-9]{1,}需要任何序列中的任意数量的数字
  • \)需要一个闭合的圆括号
  • )关闭*第一个*组
  • (开启第二场小组赛
  • .*?匹配打开和关闭子字符串之间的整个中心子字符串
  • )关闭*第二*组比赛
  • (开启第三场小组赛
  • \(需要一个开放的圆括号
  • [%]要求有一个百分号
  • [a-z]需要任何小写字母字符
  • [0-9]{1,}需要任何序列中的任意数量的数字
  • \)需要一个闭合的圆括号
  • )关闭第三
  • $确保有一个字符串结尾。这迫使第三组位于字符串的末端,而不是悬停在中间的某个地方

免责声明

在您的源问题中,似乎\r\n第三组之前的子字符串被删除,并且结果文本中包含一些额外的空格,然后在源文本中的位置。我假设那些是偶然引入或丢弃的。

于 2013-05-13T16:05:02.263 回答