python - 使用正则表达式验证用户输入

标签 python regex python-3.x 2d-games

我对正则表达式的经验非常有限,所以我希望有人可以帮助我。

我正在制作一个 Python 3 游戏,它有一个矩形网格作为棋盘。我正在尝试为用户提供一种方法,以以下形式一次将多个棋盘坐标输入到名为 coords 的字符串中:

(x1, y1), (x2, y2), (x3, y3), ... (xn, yn)

我希望输出是一个名为 cells 的元组列表,其形式类似:

[(x1, y1), (x2, y2), (x3, y3), ... (xn, yn)]

所以本质上我想模仿如何用 Python 代码编写元组。

现在我正在使用:

cells = [tuple(coords[i.find('(') + 1: i.rfind(')')].split(',')) for i in coords.split()]

它为 (1,2) (3,4) (5,6) 形式的输入生成所需的结果,输入的元组内部和元组之间没有空格。但是,这会破坏不完全遵循该形式的输入,并且不会检查有效输入。对于 cells 中元组中的每个 x 和 y 值,我需要验证:

  1. 类型(y 值)== 类型(x 值)== int
  2. 0 <= y 值 < game_board.height
  3. 0 <= x 值 < game_board.width

理想情况下,如果用户输入多个有效坐标和一些无效坐标,则有效元组将被添加到单元格中,并且用户将收到类似“以下坐标无效”的消息:(x1,y1),...”

我知道我可以通过一堆循环和流量控制来完成这一切,但是有没有一种更Pythonic的方法来使用正则表达式来完成这一切

编辑:拼写

最佳答案

正则表达式用于测试整体结构 - 其余部分无需正则表达式即可完成:

inp = "(3, 4), (a, 7), (-3, 3), (3, 3)"

def MaybeInt(n):
    """Returns an int if possible, else the original value."""
    try:
        return int(n)
    except:
        return n

def inX(n):
    """True if inside X of board."""
    return 0<=n<5

def inY(n):
    """True if inside Y of board."""
    return 0<=n<5

def structOk(t):
    import re
    return re.match(r'^\s*([^,]+,[^,]+\)\s*(?:,\s*\([^,]+,[^,]+\))*)\s*$',t)

def validate(t):
    t = t.replace(" ","")
    if not structOk(t):
        raise ValueError("Structually unsound - try again: "+t)

    k = [ x.lstrip("(") for x in t.replace(" ","").rstrip(")").split("),")]
    tups = [ tuple(map(MaybeInt,tu.split(","))) for tu in k]

    # our "decider" for whats valid/invalid which is used to divide the tuples
    # into our valid/invalid return list's
    test = lambda q: all(isinstance(num,int) for num in q) and inX(q[0]) and inY(q[1])


    rv = [[],[]]  # prepare and append by our decider test
    for k in tups:
        # True == 1, False == 0
        rv[1-test(k)].append(k)

    return rv

valid, invalid = validate(inp)

print(valid)
print(invalid)

输出:

[(3, 4), (3, 3)]    # valid
[('a', 7), (-3, 3)] # invalid

请参阅 https://regex101.com/r/OrHGaR/1 了解正则表达式和详细说明。

简短描述:它寻找 (...,...) 而...不存在,-您可以使用 f.e. 来完善它。 [1234567890a-zA-Z] 而不是 [^,] 但迟早会出现 ValueError。

关于python - 使用正则表达式验证用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419606/

相关文章:

Python:循环不等待用户的输入

python - 总结存储在数据框中的多个列表

打开网站时Python Mechanize Value错误

Python:如何在函数的本地范围内运行 eval()

javascript - jquery 输入验证正则表达式

regex - 删除批处理或 PoSh 的引号之间的逗号

python - 如何编写一个 Python 程序的异步/同步变体?

Python dict 如何在一行中创建 key 或更新 key ?

python - 在 Python Pandas 中使用 groupby 从 bool (真/假)列返回百分比结果

python 日期正则表达式