0

在python中,我有以下字符串:

|a|b\|c|d|

我想将字符串拆分为:

a
b\c
d

基本上,我必须用'|'分开 定界符,但需要特别注意反斜杠

4

3 回答 3

8

不需要正则表达式:

>>> s = '|a|b\\|c|d|'
>>> s.replace('\\|', '\\').strip('|').split('|')
['a', 'b\\c', 'd']
于 2013-04-16T15:23:56.020 回答
3

如果你想使用正则表达式,你需要一个否定的后向断言。

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

我们必须转义一些特殊字符。\|匹配单|(?<!\\)确保在|.

现在我们在列表中有一个前导和尾随的空字符串。让我们使用过滤器来删除它们。

filter(bool, matches)
于 2013-04-16T15:30:26.220 回答
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']
于 2013-04-16T15:47:05.197 回答