如果给出"RL2R'F2LD'"
之类的字符串,将其分成字符串"R" "L2" "R'" "F2" "L" "D'"
的最有效方法是什么?
我尝试了一些方法,比如首先将它们分成单个字符,然后尝试将它们添加到列表中,没有任何方法正常工作。
答案 0 :(得分:5)
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'"]
。
答案 1 :(得分:4)
您可以使用正则表达式:
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()
方法只返回已找到的所有匹配项,因此您将获得输入字符串中与该模式匹配的所有字符组的列表。
答案 2 :(得分:3)
您可以使用正则表达式:
[FBUDLRfbudlrxyz][2']?
import re
s = "RL2R'F2LD'"
for m in re.finditer("[FBUDLRfbudlrxyz][2']?", s):
print m.group(0)
(很抱歉没有解释如何在评论中这样做,我真的不懂Python。)
答案 3 :(得分:1)
如评论所述,正则表达式将是一个好方法:
>>> import re
>>> re.findall('[A-Z]{1}[0-9]{0,1}', "RL2R'F2LD'")
['R', 'L2', 'R', 'F2', 'L', 'D']