2011-03-17 20 views
0

我開始用正則表達式進行冒險。 我感興趣的是分割特殊格式的字符串。如果一個字母不在括號內,它應該成爲輸出列表的一個不同元素。括在括號內的字母應放在一起。如何用re.split分割我的字符串?

樣品:

我的字符串=>通緝名單

  • "ab(hpl)x" =>['a', 'b', 'hpl', 'x']
  • "(pck)(kx)(sd)" =>['pck', 'kx', 'sd']
  • "(kx)kxx(kd)" =>['kx', 'k', 'x', 'x', 'kd']
  • "fghk" =>['f', 'g', 'h', 'k']

如何用正則表達式和re.split來實現? 在此先感謝您的幫助。

回答

5

這不能用re.split來完成,因爲它需要在零長度匹配上進行分割。

http://docs.python.org/library/re.html#re.split

注意,分裂將永遠不會在一個空的模式匹配拆分的字符串。

這裏是一個另類:

re.findall(r'(\w+(?=\))|\w)', your_string) 

和示例:

>>> for s in ("ab(hpl)x", "(pck)(kx)(sd)", "(kx)kxx(kd)", "fghk"): 
...  print s, " => ", re.findall(r'(\w+(?=\))|\w)', s) 
... 
ab(hpl)x => ['a', 'b', 'hpl', 'x'] 
(pck)(kx)(sd) => ['pck', 'kx', 'sd'] 
(kx)kxx(kd) => ['kx', 'k', 'x', 'x', 'kd'] 
fghk => ['f', 'g', 'h', 'k'] 
+0

@Maciej Ziarko:請注意,使用''\ w''並且沒有後向斷言的答案假設括號總是平衡的,並且您的數據中永遠不會有數字和下劃線。鑑於您的測試數據,這是一個公平的假設,所以+1。 – 2011-03-17 19:29:08

+0

是的,它們將始終保持平衡。我的數據中的任何其他字符都是小寫字母。我喜歡你的答案,我把它們投了票。順便說一句:你可以推薦任何好的正則表達式教程/書有很好的例子嗎? – 2011-03-17 19:36:37

+2

我主要使用http://www.regular-expressions.info/進行學習,而http://www.rubular.com/對於正則表達式的快速測試非常有用。 – 2011-03-17 19:40:45

1

你想findallsplit。使用這個re:r'(?<=\()[a-z]+(?=\))|[a-z]',它適用於所有的測試用例。

>>> test_cases = ["ab(hpl)x", "(pck)(kx)(sd)", "(kx)kxx(kd)", "fghk"] 
>>> pat = re.compile(r'(?<=\()[a-z]+(?=\))|[a-z]') 
>>> for test_case in test_cases: 
...  print "%-13s => %s" % (test_case, pat.findall(test_case)) 
... 
ab(hpl)x  => ['a', 'b', 'hpl', 'x'] 
(pck)(kx)(sd) => ['pck', 'kx', 'sd'] 
(kx)kxx(kd) => ['kx', 'k', 'x', 'x', 'kd'] 
fghk   => ['f', 'g', 'h', 'k'] 

編輯:

\w更換[a-z]如果你想匹配大寫和小寫字母,數字和下劃線。如果括號永遠不會不平衡("abc(def"),您可以刪除後向斷言(?<=\()