<p>多次调用split可能是不够的,因为它可能会创建不需要的中间字符串。使用像您提议的那样的regex是行不通的,因为捕获组只能得到最后一个条目,而不是所有条目。像obmarg建议的那样,使用regex进行拆分似乎是最好的方法,假设您正在寻找一个“扁平”列表。</p>
<p>如果不需要展平列表,可以先使用正则表达式拆分,然后对结果进行迭代,检查原始输入以查看使用了哪个分隔符:</p>
<pre><code>items = re.split(r'\||<>', input)
offset = 0
for i in items:
delimiter = '|' if input[offset+len(i)] == '|' else '<>'
offset += len(i) + len(delimiter)
# Do something with i, depending on whether | or <> was the delimiter
</code></pre>
<p>最后,如果您根本不希望创建子字符串(例如,只使用开始和结束索引来节省空间),<code>re.finditer</code>可能会完成此任务。遍历分隔符,并根据找到的分隔符(<code>|</code>或<code><></code>)对它们之间的文本执行操作。这是一个更复杂的操作,因为你将不得不处理许多角落的情况,但可能是值得的,取决于你的需要。</p>
<p><strong>更新:</strong>对于输入格式统一的特定情况,obmarg的解决方案是最好的。如果必须这样做,请将结果后处理为具有嵌套列表:</p>
<pre><code>split_result = re.split( "\||<>", input )
result = [split_result[0], split_result[1], [i for i in split_result[2:] if i]]
</code></pre>
<p>(最后一个列表理解是确保在最后一个列表后面没有项目时,您将得到<code>[]</code>,而不是<code>['']</code>)</p>
<p><strong>更新2:</strong>在阅读了更新后的问题后,我终于理解了您想要实现的目标。下面是使用前面建议的框架的完整示例:</p>
<pre><code>items = re.split(r'\||<>', input) # Split input in items
offset = 0
result = [] # The result: strings for regular itens, lists for <> separated ones
acc = None
for i in items:
delimiter = '|' if offset+len(i) < len(input) and input[offset+len(i)] == '|' else '<>'
offset += len(i) + len(delimiter)
if delimiter == '<>': # Will always put the item in a list
if acc is None:
acc = [i] # Create one if doesn't exist
result.append(acc)
else:
acc.append(i)
else:
if acc is not None: # If there was a list, put the last item in it
acc.append(i)
else:
result.append(i) # Add the regular items
acc = None # Clear the list, since what will come next is a regular item or a new list
print result
</code></pre>
<p>用你的例子测试,结果是:</p>
<pre><code>['a', 'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c','de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'aha'],
'b', 'c', 'de', ['f', 'ge', 'ah']]
</code></pre>