2013-04-16 84 views
0

在蟒蛇, 我有以下字符串:蟒蛇正則表達式字符串分割

|a|b\|c|d| 

我要拆分的字符串:

a 
b\c 
d 

基本上,我有分裂「|」分隔符,但需要照顧反斜槓專門

+0

我是新手在正則表達式。嘗試了幾個像:re.split('。*!\\ |。*!\',x) – wantro

+2

只是爲了確認:反斜槓的意思是「忽略下面的分隔符」?這有點不尋常 - 通常它意味着更像「下面的字符不被用作分隔符」,並且你想要'a','b | c','d'。 – DSM

+2

@DSM,它必須是一個錯字。 S /他可能意味着'b | c',而不是'b \ c'。 – alexis

回答

3

如果你想使用正則表達式,你需要一個負向後斷言。

import re 
data = '|a|b\|c|d|' 
matches = re.split(r'(?<!\\)\|', data) 

我們必須轉義一些特殊字符。 \|匹配單個|(?<!\\)確保在|之前沒有反斜槓。

現在我們在列表中有一個前導和尾隨的空字符串。讓我們用一個過濾器來刪除它們。

filter(bool, matches) 
8

沒有必要對正則表達式:

>>> s = '|a|b\\|c|d|' 
>>> s.replace('\\|', '\\').strip('|').split('|') 
['a', 'b\\c', 'd'] 
+0

謝謝你。我知道它不需要正則表達式。但更多的是學習目的。 – wantro

1

這是我不清楚,如果你的意思是b|c逃逸b\|c的結果,你有一個錯字?你的結果是非標準的,因爲\通常用於逃避拆分並保留下面的分隔符。

我會假設你想在大多數情況下使用更常見的b|c

對於一個正則表達式的解決方案,(在這種情況下b\c)這個作品:

>>> [e for e in re.split(r'\|',s.replace('\|','\\')) if e] 
['a', 'b\\c', 'd'] 

我使用了Python更換爲 '\ |'而不是正則表達式,因爲它使正則表達式更容易理解。

如果你想(我認爲是更常見)b|c只需添加回:

>>> [e.replace('\\','|') for e in re.split(r'\|',s.replace('\|','\\')) if e] 
['a', 'b|c', 'd'] 

或者,你可以使用csv

import StringIO 
import csv 

s='|a|b\|c|d|' 

f = StringIO.StringIO(s) 
reader = csv.reader(f, delimiter='|', escapechar='\\') 

for row in reader: 
    print filter(bool,row) 

打印:

['a', 'b|c', 'd']