在Python中基于搜索词划分字符串?

2024-05-16 10:31:19 发布

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

给定一个字符串:

x = 'foo test1 test1 foo test2 foo'  

我想用foo对字符串进行分区,这样就可以得到如下结果:

['foo', 'test1 test1 foo', 'test2 foo'] (preferred)

                 or

[['foo'], ['test1', 'test1', 'foo'], ['test2', 'foo']]  (not preferred, but workable)

我试过itertools.groupby

In [1209]: [list(v) for _, v in itertools.groupby(x.split(), lambda k: k != 'foo')]
Out[1209]: [['foo'], ['test1', 'test1'], ['foo'], ['test2'], ['foo']]

但这并不能完全满足我的需求。我知道我可以用一个循环来做这个:

In [1210]: l = [[]]
      ...: for v in x.split():
      ...:     l[-1].append(v)
      ...:     if v == 'foo':
      ...:         l.append([])
      ...:     

In [1211]: l
Out[1211]: [['foo'], ['test1', 'test1', 'foo'], ['test2', 'foo'], []]

但将空列表放在最后并不是很有效。有更简单的方法吗?你知道吗

我想保留分隔符。你知道吗


Tags: or字符串inforfoooutsplit分区
3条回答

您可以将str.partition用于您的案例:

def find_foo(x):
    result = []
    while x:
        before, _, x = x.partition("foo")
        result.append(before + "foo")
    return result

>>> find_foo('foo test1 test1 foo test2 foo')
>>> ['foo', ' test1 test1 foo', ' test2 foo']

也许不是最漂亮的方法,但简洁明了:

[part + 'foo' for part in g.split('foo')][:-1]

输出:

['foo', ' test1 test1 foo', ' test2 foo']

你想过在字符串上迭代并使用一个开始位置来搜索吗?这通常比在你走的时候把琴弦切碎要快。这可能适合您:

x = 'foo test1 test1 foo test2 foo'  

def findall(target, s):
    lt =len(target)
    ls = len(s)
    pos = 0
    result = []
    while pos < ls:
        fpos = s.find(target, pos)+lt
        result.append(s[pos:fpos])
        pos = fpos
    return result

print(findall("foo", x))

相关问题 更多 >