我需要确保列表中只有某些字符?

时间:2015-06-23 02:55:07

标签: python regex string list python-2.7

我有这个来获取输入并将其放在一个列表中:

def start():
    move_order=[raw_input("Enter your moves: ").split()]

我只想要允许角色A,D,S,C,H(游戏> _>)。我尝试过使用正则表达式:

if re.match('[ADSCH]+', [move_order]) is False:
    print "That's not a proper move!"
    return start()

......以不同的形式......

string_test=re.compile('[ADSCH]+')
    if string_test.match(move_order]) is False:
        print "That's not a proper move!"
        return start()

Aaaaand无法让它发挥作用。我确实在这些代码块中做错了什么,我试图搞清楚,但它没有用。了解我做错了什么会很好,但我的问题的解决方案会让我感觉更多。我甚至可能不需要使用re,但在我看来,这是一种实现我想要的空间有效方式。我认为我的直接问题是我不知道如何使用列表(除非(当然)还有其他明显的问题,训练有素的眼睛可以找到)。

我会继续问,因为我也可能会把它搞砸了,但是我还需要确保一个C永远不会在一个H之后...但是一点点提示是可以接受的,因为我喜欢搞清楚事情。

4 个答案:

答案 0 :(得分:1)

有很多方法可以匹配ADSCH'
您可以使用raw_input().upper()删除'adsch'

使用re:不要在

之前进行拆分
def start():
    movement = raw_input("Enter your moves: ").upper()
    if re.match('^[ADSCH\s]*$', movement):
        # it's a legal input

使用str.strip

if movement.strip(' ADSCH') == '':
    # it's a legal input

allmove_order列表一起使用(也可以使用字符串):

def start():
    move_order=[raw_input("Enter your moves: ").upper().split()]
    if all((x in 'ADSCH' for x in move_order)):
        # it's a legal input

anymove_order列表一起使用(也可以使用字符串):

if any((x not in 'ADSCH' for x in move_order)):
    # it's an illegal input

答案 1 :(得分:0)

我不知道python,但你可以这样做:

for c in move_order:
if (c == 'A' or c == 'D' c == 'S' or c == 'C' or c == 'H'):
[do something with the character]

答案 2 :(得分:0)

如此小范围你可以迭代move_order并检查每个元素是否存在于允许的移动中

def start():
    move_order=[c for c in raw_input("Enter your moves: ")]
    moves = ['A','D','S','C','H']
    for c in move_order:
        if c not in moves:
            print "That's not a proper move!"
            return start()

编辑:解决方案考虑到评论中的建议

def start():
move_order=list(input("Enter your moves: "))
    while set(move_order) - set('ADSCH'):
        for x in set(move_order) - set('ADSCH'):
          move_order = [input("%s is not a vaild move, please enter another move" % x) if i==x else i for i in move_order]
    Print "Player ready" #Rest of program..

如果我理解你的问题,我不认为分裂正在按照你的想法行事。它不会将用户输入的字符串的每个字符拆分为数组。

答案 3 :(得分:0)

之后你对这些角色做了什么?甚至可能没有必要采取这一步骤。设计它,以便当你为动作做动作时,你不会做任何无效动作。

def move_left():
    print "Moving left"

def move_down():
    print "moving down"

#...etc

def invalid_move():
    print "invalid move"

# This dictionary connects move command letters
# with the functions above that do the moving
move_funcs = {
    'A': move_left,
    'S': move_down,
    'D': move_right,
    'C': wtf_keyboard_layout,
    'H': do_H_thing
}

moves = raw_input("Enter your moves: ")
for move in moves.upper():

    # this gets the right function for the move, 
    # e.g. A gets move_left
    # but any character not there gets invalid_move
    move_func = move_funcs.get(move, invalid_move)
    move_func()