如果给定的 "RL2R'F2LD'"
之类的字符串,将其拆分为字符串"R" "L2" "R'" "F2" "L" "D'"
的最有效方法是什么?我尝试了几种类似的方法,例如首先将它们拆分为单独的炭,然后尝试将它们添加到列表中,而没有任何正确的方法。
def rubikstring(s):
import string
cumu = ''
for c in s:
if c in string.ascii_letters:
if cumu: yield cumu
cumu = ''
cumu += c
if cumu: yield cumu
可以做你的工作。用
>>> for i in rubikstring("RL2R'F2LD'"): i
...
'R'
'L2'
"R'"
'F2'
'L'
"D'"
您获得了理想的结果,
>>> list(rubikstring("RL2R'F2LD'"))
['R', 'L2', "R'", 'F2', 'L', "D'"]
也。
您可以使用正则表达式:
import re
cubedirs = re.compile(r"[RLFBUDrlfbudxyz][2']?")
cubedirs.findall("RL2R'F2LD'")
这输出['R', 'L2', "R'", 'F2', 'L', "D'"]
。
正则表达式实际上非常简单。[..]
字符组的意思是:匹配一个字符(因此R
或L
或F
等)。
然后,我们寻找第二个字符组 匹配1个字符,即 2
或 '
。第二个字符之后的问号是使其可选的。我们指定的是,如果'
或2
字符不存在。
.findall()
方法简单地返回已找到的所有匹配,因此您将在输入字符串中获得与模式相匹配的所有字符组的列表。
您可以使用正则表达式:
[FBUDLRfbudlrxyz][2']?
这是现场演示。
import re
s = "RL2R'F2LD'"
for m in re.finditer("[FBUDLRfbudlrxyz][2']?", s):
print m.group(0)
(对不起,我真的不知道如何在评论中解释如何做。)
正常表达式将是一个好方法:
>>> import re
>>> re.findall('[A-Z]{1}[0-9]{0,1}', "RL2R'F2LD'")
['R', 'L2', 'R', 'F2', 'L', 'D']