用一种巧妙的方法来分割字符串\

2024-04-24 11:15:08 发布

您现在位置:Python中文网/ 问答频道 /正文

像这样的字符串:

x = dir\tsubdir1\t\tfile1.ext\t\tsubsubdir1\tsubdir2\t\tsubsubdir2\t\t\tfile2.ext

如何“pythonish/tricky”将上面的字符串拆分为列表?你知道吗

dir
\tsubdir1
\t\tfile1.ext
\t\tsubsubdir1
\tsubdir2
\t\tsubsubdir2
\t\t\tfile2.ext

['dir', '\tsubdir1', '\t\tfile1.ext', '\t\tsubsubdir1', '\tsubdir2', '\t\tsubsubdir2', '\t\t\tfile2.ext']

概念证明:

x = r'dir\tsubdir1\t\tfile1.ext\t\tsubsubdir1\tsubdir2\t\tsubsubdir2\t\t\tfile2.ext'
y = x.split(r'\t')
print(y)

Tags: 字符串证明概念列表dirextsplittricky
3条回答

也许用正则表达式?你知道吗

>>> import regex
>>> L = regex.split(r"(?<!\t)\t", "dir\tsubdir1\t\tfile1.ext\t\tsubsubdir1\tsubdir2\t\tsubsubdir2\t\t\tfile2.ext")
>>> L
['dir', 'subdir1', '\tfile1.ext', '\tsubsubdir1', 'subdir2', '\tsubsubdir2', '\t\tfile2.ext']
>>> L[:1] + ['\t' + i for i in L[1:]]
['dir', '\tsubdir1', '\t\tfile1.ext', '\t\tsubsubdir1', '\tsubdir2', '\t\tsubsubdir2', '\t\t\tfile2.ext']

它是如何工作的?

正则表达式是

(?<!\t)\t

这意味着“一个标签前面没有另一个标签”,所以标签序列中的每个第一个标签都与regex匹配。然后用作分割标记。你知道吗

拆分之后,从每个后续项中剥离一个选项卡,因此最后一行L[:1] + ['\t' + i for i in L[1:]]将缺少的选项卡放回前面。你知道吗

import re

x = 'dir\tsubdir1\t\tfile1.ext\t\tsubsubdir1\tsubdir2\t\tsubsubdir2\t\t\tfile2.ext'

s = re.sub('([^\t])\t', '\\1\n\t', x).split('\n')

print(s)

输出:

['dir', '\tsubdir1', '\t\tfile1.ext', '\t\tsubsubdir1', '\tsubdir2', '\t\tsubsubdir2', '\t\t\tfile2.ext']

您可以通过触摸path输入的每个字符一次+一些list comp:

path = "dir\tsubdir1\t\tfile1.ext\t\tsubsubdir1\tsubdir2\t\tsubsubdir2\t\t\tfile2.ext"

l = [[]]
for c in path:
    if c != "\t":              # append to last element of list if not a \t
        l[-1].append(c)
    elif l[-1][-1] == "\t":    # also append to last element of list if it's last is a \t
        l[-1].append(c)        # (you could 'or' it into the if before)
    else:
        l.append([])           # else create a new "word" and append the \t
        l[-1].append(c)

l = [''.join(elem) for elem in l]   # join the things back together
print(l)

输出:

['dir', 
 '\tsubdir1', 
 '\t\tfile1.ext', 
 '\t\tsubsubdir1', 
 '\tsubdir2',
 '\t\tsubsubdir2', 
 '\t\t\tfile2.ext']

在连接步骤之前,累积的列表如下所示:

[['d', 'i', 'r'], 
 ['\t', 's', 'u', 'b', 'd', 'i', 'r', '1'], 
 ['\t', '\t', 'f', 'i', 'l', 'e', '1', '.', 'e', 'x', 't'], 
 ['\t', '\t', 's', 'u', 'b', 's', 'u', 'b', 'd', 'i', 'r', '1'], 
 ['\t', 's', 'u', 'b', 'd', 'i', 'r', '2'], 
 ['\t', '\t', 's', 'u', 'b', 's', 'u', 'b', 'd', 'i', 'r', '2'], 
 ['\t', '\t', '\t', 'f', 'i', 'l', 'e', '2', '.', 'e', 'x', 't']]

您不想添加到字符串,因为它会创建许多中间的“丢弃”字符串实例,这会减慢它的速度-usings list要快得多,压力也要小得多。你知道吗

相关问题 更多 >