2013-05-13 38 views
0

這是字符串我已經(忽略空格)我將如何分離基於某種模式的字符串,而不會丟失python中的匹配參數?

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)' ] 

它有點像檢查的模式(%Ø\ d +)的和(%i \ d +)並分裂它們發生的位置,但不會丟失模式本身,a.split(blah)通常會鬆動'blah'。在我的背景下,'等等'是重要的,我不能放鬆它。

可能有超過2次出現的模式,所以我需要分開 (%o \ d +)和(%i \ d +)以及它們之間的任何文本。 最好的辦法是做什麼? 即時通訊不知道是否正則表達式可以做到這一點,或現有修改的text.split不鬆散的拆分參數會做(如果存在)

回答

3

如果您使用圍繞匹配參數re.split捕獲括號返回匹配參數。

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

更多資訊here

+0

好吧,讓我測試一下。 – mike 2013-05-14 06:54:15

+0

以及它工作正常,謝謝它甚至適用於b = a * 2(與自身並置)。還有一件事我怎麼會在比賽結束後襬脫空弦?似乎比賽最終會出現一些空場。 – mike 2013-05-14 07:01:43

1

說明

在Python中你可以使用

this link to regex(\([%][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,}需要以任何順序的任何數量的數字
  • \)需要一個近圓括號
  • )關閉third group
  • $確保有字符串結尾。這迫使第三組是在字符串的結尾,而不是中間

免責聲明某處徘徊

在源問題似乎在\r\n子那裏下降之前,第三組有在結果文本中包含了一些額外的空格,然後是源文本中的哪些地方。我假設那些由於意外而引入或丟棄的人。

+0

它適用於像一個o給的字符串,但我不認爲它適用於* 2正常工作,正如我指出的,我需要它爲不止一個事件工作。 – mike 2013-05-14 07:03:29

相關問題