0
A
回答
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']
相關問題
- 1. 正則表達式分割字符串
- 2. 正則表達式分割字符串
- 3. 正則表達式分割字符串
- 4. 正則表達式分割字符串
- 5. 蟒蛇字符串分割
- 6. 蟒蛇正則表達式:從字符串端到端數字
- 7. 蟒蛇正則表達式
- 8. 正則表達式打破由字符串分割字符串
- 9. 蟒蛇:分割字符串的字符
- 10. 蟒蛇正則表達式分組
- 11. 貪婪的正則表達式分割蟒蛇每第n行
- 12. 正則表達式來分割蟒蛇%年齡和值
- 13. 蟒蛇正則表達式分割功能問題
- 14. 正則表達式切割字符串
- 15. 蟒蛇正則表達式/分兩個名字之間的串
- 16. 正則表達式匹配字符串蟒蛇
- 17. 蟒蛇正則表達式的匹配字符串排除
- 18. 蟒蛇正則表達式不匹配解碼unicode字符串
- 19. 蟒蛇正則表達式驗證類型的字符串
- 20. 蟒蛇:排除字符串正則表達式
- 21. 蟒蛇在字符串與正則表達式
- 22. 蟒蛇正則表達式查找字符串
- 23. 蟒蛇正則表達式 - 字符串匹配的匹配尾
- 24. 蟒蛇搜索和更新字符串與正則表達式
- 25. 查找子字符串和使用正則表達式,蟒蛇
- 26. 正則表達式使字符串有意義。蟒蛇
- 27. 蟒蛇正則表達式,從一個字符串
- 28. 蟒蛇正則表達式替換匹配字符串
- 29. 在字符串中提取數蟒蛇正則表達式
- 30. 蟒蛇正則表達式給出空字符串
我是新手在正則表達式。嘗試了幾個像:re.split('。*!\\ |。*!\',x) – wantro
只是爲了確認:反斜槓的意思是「忽略下面的分隔符」?這有點不尋常 - 通常它意味着更像「下面的字符不被用作分隔符」,並且你想要'a','b | c','d'。 – DSM
@DSM,它必須是一個錯字。 S /他可能意味着'b | c',而不是'b \ c'。 – alexis