【问题标题】:Remove specific substrings containing integers in Python在 Python 中删除包含整数的特定子字符串
【发布时间】:2020-05-05 09:43:35
【问题描述】:

对于一个小型项目,我正在尝试将国际象棋游戏字符串转换为国际象棋移动的列表。 给定的字符串可能如下所示:s="1. e4 e5 2. Nf3 Nf6 3. Nc3 d6 4. Bc4 h6 5. d3 Be7 6. Be3 Nc6"

现在我想知道什么是最有效的方法来摆脱表示我们在游戏中的移动对的整数(例如"1."),而不是表示什么的整数棋子移动的场坐标(例如"e4")。

我目前的做法如下:

s = s.replace('.', '').split(" ")
s = [e for e in s if not e.isdigit()]

如果我不想转换为列表,而只是删除上面指出的特定部分,我将如何有效地做到这一点?我可以为此使用re 的正则表达式吗?

【问题讨论】:

    标签: python regex string split


    【解决方案1】:

    您可以使用endswith 来检查以. 结尾的子字符串。

    s="1. e4 e5 2. Nf3 Nf6 3. Nc3 d6 4. Bc4 h6 5. d3 Be7 6. Be3 Nc6"
    
    s = " ".join([substr for substr in s.split() if not substr.endswith('.')])
    

    输出: 'e4 e5 Nf3 Nf6 Nc3 d6 Bc4 h6 d3 Be7 Be3 Nc6'

    【讨论】:

    • 我喜欢这个答案。我无法告诉你它是否更有效,但因为它避免了re.module,它可能是?荣誉 =)
    • 我完全忘记了这种方法,利用每个移动对分隔符以"."结尾的事实。这行得通!
    【解决方案2】:

    你可以使用re.split,如下方式:

    import re
    s = "1. e4 e5 2. Nf3 Nf6 3. Nc3 d6 4. Bc4 h6 5. d3 Be7 6. Be3 Nc6"
    moves = re.split(r'\s*\d+\.\s*', s)
    print(moves)
    

    输出:

    ['', 'e4 e5', 'Nf3 Nf6', 'Nc3 d6', 'Bc4 h6', 'd3 Be7', 'Be3 Nc6']
    

    请注意,我使用了所谓的原始字符串(或 r-string),所以我不必转义 \,我使用的模式可能被解读为:

    • 0 个或多个空格
    • 1 位或多位数字 (0-9)
    • .(这个需要转义,因为.在模式中有特殊含义)
    • 0 个或多个空格

    如果您更喜欢交互式解释,您可以将该模式粘贴到regex101.com。 请注意,在移动开始时有空的str,但可以使用列表切片轻松删除它(即moves = moves[1:]

    【讨论】:

      猜你喜欢
      • 2022-11-18
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2014-04-10
      相关资源
      最近更新 更多