按照给定格式将字符串分割成列表

3
我有一个字符串,如"SAB_bARGS_D"。 我想要的是将字符串分成字符列表,但每当出现 _ 标记时,下一个字符都会附加到前一个字符上。
所以上面的答案应该是['S','A','B_b','A','R','G','S_D'] 可以使用for循环遍历列表来完成,但是否有内置函数可以使用...
谢谢

1
我认为在这里使用for循环会是最优的选择。列表推导式解决方案基本上需要进行至少两次遍历,对于可读性来说非常糟糕。 - aaronasterling
1
有没有人能演示一下如何使用for循环来完成它? - user225312
"SAB_b_ARGS_D" 这个输入可能吗? - Rozuur
不可以......没有任何字母两侧都与下划线连接。 - user506710
3个回答

5
我知道,我会使用正则表达式:
>>> import re
>>> pattern = "[^_]_[^_]|[^_]"
>>> re.findall(pattern, "SAB_bARGS_D", re.IGNORECASE)
['S', 'A', 'B_b', 'A', 'R', 'G', 'S_D']

该模式尝试匹配三个连续字符 - 非下划线、下划线、非下划线 - 如果匹配失败,则尝试匹配一个非下划线字符。

嘿,你的回答正是我想要的......但我有一个问题要问......相比下面给出的for循环建议,使用re是否更好,从复杂性的角度来看???因为我不知道re用于检查模式时使用了什么,所以与使用普通循环相比,它是否会导致性能下降.....这是一个普遍的疑问,不仅仅是在这个搜索中。 - user506710
如果您使用timeit,您会发现在这种情况下使用re.findall比使用下面的函数稍微快一点 - 如此微小以至于我敢猜测两者在复杂度上是相同的。好吧,处理复杂性是另一回事。代码复杂性则另当别论。 - Robert Rossney
另外,针对您的后续问题,请使用模式 [a-z]_[0-9]+|[a-z] - Robert Rossney

2
我可能会使用一个 for 循环。
def a_split(inp_string):
    res = []
    if not inp_string: return res  # allows us to assume the string is nonempty

    # This avoids taking res[-1] when res is empty if the string starts with _
    # and simplifies the loop.
    inp = iter(inp_string)   
    last = next(inp)
    res.append(last)

    for c in inp:
        if '_' in (c, last): # might want to use (c == '_' or last == '_')
            res[-1] += c
        else:
            res.append(c)
        last = c
    return res

通过将res.append存储在本地变量中并直接引用它,而不是引用本地变量res并执行属性查找以获取append方法,可以获得一些性能提升。

如果有一个字符串'a_b_c',则它不会被拆分。在这种情况下未指定任何行为,但修改其执行其他操作并不难。同样,类似于'_ab'的字符串将被拆分为['_a', 'b']'ab_'也是如此。


1

使用正则表达式

>>> import re
>>> s="SAB_bARGS_D"
>>> re.findall("(.(?:_.)?)",s)
['S', 'A', 'B_b', 'A', 'R', 'G', 'S_D']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接