[英]Most efficient way of splitting strings like rubik's cube notations in python?
如果给出了类似"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)
(很抱歉,我没有在注释中解释如何做,我并不真正了解Python。)
如前所述,正则表达式将是一个好方法:
>>> import re
>>> re.findall('[A-Z]{1}[0-9]{0,1}', "RL2R'F2LD'")
['R', 'L2', 'R', 'F2', 'L', 'D']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.