Python 根据给定的格式将字符串划分为列表
我有一个字符串,像Python 根据给定的格式将字符串划分为列表,python,Python,我有一个字符串,像“SAB\u bARGS\u D”。我想要的是,字符串被划分为字符列表,但只要有一个uu符号,下一个字符就会附加到上一个字符 所以上面的答案应该是['S','A','B_B','A','R','G','S_D'] 它可以通过使用for循环遍历列表来完成,但是是否有一个内置函数可以使用 非常感谢 更新 大家好 多亏了罗伯特·罗斯尼,aaronasterling,我得到了所需的答案,但我有一个完全相似的问题,我只想在这里问。。。。。。假设现在我的字符串有一个标准,它可以有一个字母
“SAB\u bARGS\u D”
。我想要的是,字符串被划分为字符列表,但只要有一个uu符号,下一个字符就会附加到上一个字符
所以上面的答案应该是['S','A','B_B','A','R','G','S_D']
它可以通过使用for循环遍历列表来完成,但是是否有一个内置函数可以使用
非常感谢
更新 大家好
多亏了罗伯特·罗斯尼,
aaronasterling
,我得到了所需的答案,但我有一个完全相似的问题,我只想在这里问。。。。。。假设现在我的字符串有一个标准,它可以有一个字母或一个字母后跟u和一个数字。。。。。现在我如何将字符串拆分为列表。。。。。。建议的解决方案现在无法使用,因为S_10将被分为S_1和0。。。。。。如果有人能告诉我们如何使用RE来实现这一点,那将是很有帮助的。。。。非常感谢 我可能会对循环使用
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”
的字符串将拆分为[''u a',b']
,类似地,对于“ab”
,我知道,我将使用正则表达式:
>>> import re
>>> pattern = "[^_]_[^_]|[^_]"
>>> re.findall(pattern, "SAB_bARGS_D", re.IGNORECASE)
['S', 'A', 'B_b', 'A', 'R', 'G', 'S_D']
模式尝试匹配一行中的3个字符-非下划线、下划线、非下划线-如果不匹配,则尝试匹配非下划线字符。使用正则表达式
>>> import re
>>> s="SAB_bARGS_D"
>>> re.findall("(.(?:_.)?)",s)
['S', 'A', 'B_b', 'A', 'R', 'G', 'S_D']
我认为for
循环在这里是最佳的。列表理解解决方案基本上必须至少通过两次,并且可读性差。有人能证明它可以使用for循环完成吗?“SAB_b_ARGS_D”这个输入可能吗?不可能。。。。。没有一封信在两边都加上你的回答是我想要的。。。。但是我有一个问题要问。。。。就复杂性而言,使用re是否比下面给出的for循环建议更好???如中所述,我不知道重复使用什么来检查模式,因此与使用普通循环相比,它是否会导致性能下降。。。。。这是一个普遍的疑问,不仅仅是在这个搜索中……如果你使用timeit
,你会发现在这种情况下使用re.findall
比使用下面的函数稍微快一点——如此之小,以至于我会冒险猜测两者在复杂性上是相同的。嗯,处理的复杂性。代码复杂性是另一个问题。另外,对于后续问题,请使用模式[a-z].[0-9]+|[a-z]
。