Python:拆分字符串并获取位置

时间:2015-03-03 10:03:45

标签: python string split

我想将一个字符串拆分成片段,并希望获得该字符串的分割部分的(起始)位置。

我可以使用以下代码执行此操作:

str_ = '  d     A7    g7'
flag_non_space_string_started = False
positions = []
for i, letter in enumerate(str_):
    if letter is not ' ':
        if not flag_non_space_string_started:
            positions.append(i)
            flag_non_space_string_started = True
    else:
        flag_non_space_string_started = False
# this is what I want
print(str_.split())
print(positions)
# prints:
# ['d', 'A7', 'g7']
# [2, 8, 14]

是否有更短(更pythonic)的方式来获得这些职位?

1 个答案:

答案 0 :(得分:4)

您可以在itertools.groupby使用enumerate。在这里,我们使用not str.isspace将项目分组到空白处,因此k对于非空白字符将为True,对于空白字符将为False,因此if k条件。现在因为每个组都是一个迭代器,我们需要在其上调用next()来获取起始索引以及第一个字符。现在,要获取其余的组项,请使用list-comprehension并将其传递给str.join以获取字符串。不要忘记将我们之前弹出的项目添加到此字符串中:

from itertools import groupby

str_ = '  d     A7    g7'

for k, g in groupby(enumerate(str_), lambda x: not x[1].isspace()):
    if k:
        pos, first_item = next(g)
        print pos, first_item + ''.join([x for _, x in g])

输出:

2 d
8 A7
14 g7

如果上述解决方案看起来很复杂,那么也可以使用re.finditer。 re.finditer返回的匹配对象具有.start()和group()等方法,它们分别对应于匹配组的起始索引和组本身。

import re

str_ = '  d     A7    g7'

for m in re.finditer(r'\S+', str_):
    index, item = m.start(), m.group()
    # now do something with index, item