我想将一个字符串拆分成片段,并希望获得该字符串的分割部分的(起始)位置。
我可以使用以下代码执行此操作:
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)的方式来获得这些职位?
答案 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