假设有一个包含字母和两个分隔符 1 和 2 的字符串 s。我想按以下方式拆分字符串:
- 如果子字符串 t 位于 1 和 2 之间,则返回 t
- 否则,返回每个字符
因此,如果 s = 'ab1cd2efg1hij2k',则预期输出为 ['a', 'b', 'cd', 'e', 'f', 'g', 'hij', 'k']。
我尝试使用正则表达式:
import re
s = 'ab1cd2efg1hij2k'
re.findall( r'(1([a-z]+)2|[a-z])', s )
[('a', ''),
('b', ''),
('1cd2', 'cd'),
('e', ''),
('f', ''),
('g', ''),
('1hij2', 'hij'),
('k', '')]
我可以通过以下代码来获得答案:[ x[x[-1]!=''] for x in re.findall(r'(1([a-z]+)2|[a-z])', s) ]
,但是我仍然不理解输出结果。根据官方文档,如果正则表达式模式包含多个组,则findall
函数返回一个元组列表。然而,我的模式只包含一个组。若有任何解释,请不吝赐教。
1
和2
周围使用非捕获组,也不需要在整个模式周围使用分组(这会在输出中浪费大量的精力来跳过)。相反,只需接受findall
调用将返回 2 元组,并使用a = [x or y for x, y in a]
将它们转换为单个值即可。 - Blckknght