【问题标题】:Problem with regular expressions '-' between numbers and strings数字和字符串之间的正则表达式“-”的问题
【发布时间】:2021-05-24 15:42:15
【问题描述】:

假设我有这个字符串

'1. A4  1... d5  2. c4  2... Yf6  3. NP3  3... dxc4  4. BO3  4... BK4  5. e3  5... Bf3  6. Q3  6... e6  7. Bc4  7... B4  8. O-O  8... B3  9. b3  9... O-O  10. B3  10... Re8  11. Q7  1-0'

我想删除未附加到字母的数字,如果您滚动到最后,我也希望删除 1-0,所以像这样

['A4', 'd5', ..., 'O-O', ..., 'Q7']

所以我尝试了这个,

re.findall(r'(?:[^\W\d_]+\d|\d+[^\W\d_])[^\W_]*|[^\W\d_]+', text)

但是得到了这个,

['A4', 'd5', ..., 'O', 'O', ..., 'Q7']

所以它正在删除我想要的1-0-,但也删除了O-O

【问题讨论】:

  • “它正在为1-0 删除-”是什么意思?不是删除了1-0全部吗?
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?
  • 我复制了错误的东西,MY BAD 没有看到它

标签: python python-3.x regex


【解决方案1】:

为什么要在这里使用正则表达式?您可以只split 字符串并获取奇数索引:

>>> s = '1. A4  1... d5  2. c4  2... Yf6  3. NP3  3... dxc4  4. BO3  4... BK4  5. e3  5... Bf3  6. Q3  6... e6  7. Bc4  7... B4  8. O-O  8... B3  9. b3  9... O-O  10. B3  10... Re8  11. Q7  1-0'
>>> list(itertools.islice(s.split(), 1, None, 2))
['A4',
 'd5',
 'c4',
 'Yf6',
 'NP3',
 'dxc4',
 'BO3',
 'BK4',
 'e3',
 'Bf3',
 'Q3',
 'e6',
 'Bc4',
 'B4',
 'O-O',
 'B3',
 'b3',
 'O-O',
 'B3',
 'Re8',
 'Q7']

【讨论】:

  • OP 的要求是 remove the numbers not attached to letters,此答案有效,但在 2 位数字或长度未知的数字上会失败。
  • @Jared 我不相信它会失败。这个解决方案没有任何东西可以区分 1 位数字和 2 位或更多位数字,甚至不关心每个令牌的内容。输入是单场国际象棋中的移动列表。很明显,张贴者想要从动作中过滤掉转数。
【解决方案2】:

查找所有至少包含一个字母的单词:

re.findall(r'\S*[a-zA-Z]\S*', text)

['A4', 'd5', 'c4', 'Yf6', 'NP3', 'dxc4', 'BO3', 'BK4', 'e3', 'Bf3', 'Q3', 'e6', 'Bc4', 'B4', 'O-O', 'B3', 'b3', 'O-O', 'B3', 'Re8', 'Q7']

【讨论】:

    【解决方案3】:

    您可以使用列表推导遍历字符串并使用isidigt 检查每个项目是否包含数字。

    str1 = '1. A4  1... d5  2. c4  2... Yf6  3. NP3  3... dxc4  4. BO3  4... BK4  5. e3  5... Bf3  6. Q3  6... e6  7. Bc4  7... B4  8. O-O  8... B3  9. b3  9... O-O  10. B3  10... Re8  11. Q7  1-0'
    output = list(filter(None, [i if i.replace("-","").isdigit()==False else None for i in str1.replace(".", "").split(' ')]))
    

    打印(输出)给出:

    ['A4', 'd5', 'c4', 'Yf6', 'NP3', 'dxc4', 'BO3', 'BK4', 'e3', 'Bf3', 'Q3', 'e6', 'Bc4', 'B4', 'O-O', 'B3', 'b3', 'O-O', 'B3', 'Re8', 'Q7']
    

    【讨论】:

    • 但是你最后有 '1-0' 我不想要那个,所有有 'number - number' 的都不好
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2019-03-30
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多