在python中, 我有以下字符串:
|a|b\|c|d|
我想将字符串拆分为:
a
b\c
d
基本上,我必须用'|'拆分分隔符,但需要特别注意反斜杠
答案 0 :(得分:8)
不需要正则表达式:
>>> s = '|a|b\\|c|d|'
>>> s.replace('\\|', '\\').strip('|').split('|')
['a', 'b\\c', 'd']
答案 1 :(得分:3)
如果你想使用正则表达式,你需要一个负面的lookbehind断言。
import re
data = '|a|b\|c|d|'
matches = re.split(r'(?<!\\)\|', data)
我们必须逃避一些特殊角色。 \|
与单|
匹配。 (?<!\\)
确保|
之前没有反斜杠。
现在我们在列表中有一个前导和尾随空字符串。我们使用过滤器删除它们。
filter(bool, matches)
答案 2 :(得分: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']