在python中,我有以下字符串:
|a|b\|c|d|
我想将字符串拆分为:
a
b\c
d
基本上,我必须用'|'分开 定界符,但需要特别注意反斜杠
不需要正则表达式:
>>> s = '|a|b\\|c|d|'
>>> s.replace('\\|', '\\').strip('|').split('|')
['a', 'b\\c', 'd']
如果你想使用正则表达式,你需要一个否定的后向断言。
import re
data = '|a|b\|c|d|'
matches = re.split(r'(?<!\\)\|', data)
我们必须转义一些特殊字符。\|
匹配单|
。(?<!\\)
确保在|
.
现在我们在列表中有一个前导和尾随的空字符串。让我们使用过滤器来删除它们。
filter(bool, matches)
我不清楚您的意思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']