检查 Python 字符串是否为有效的 Excel 单元格

Check if a Python string is a valid Excel cell

给定 Python 中的一些字母数字字符串,例如

如何检查字符串是否是有效的 Excel 单元格(即 字母在数字之前 )?

我试过用.isalpha.isdigit方法对"gather"字母和数字,然后用.index检查是否所有字母都出现在数字之前,但是我的逻辑变得太复杂了,我觉得我没有考虑到所有的可能性。

有没有简单的方法可以做到这一点?

预期结果:

>>> is_valid_excel_cell('A9')
True
>>> is_valid_excel_cell('B44B')
False
>>> is_valid_excel_cell('C101')
True
>>> is_valid_excel_cell('4D4')
False

我会使用正则表达式,非常适合这个任务:

import re

def is_valid_excel_cell(c):
    m = re.match("[A-Z]+\d+$",c)
    return bool(m)

检查单元格内容是否以大写字母开头并以数字结尾。

现在,如果需要对数字进行范围检查,还需要再执行一步,可以提取数字并将它们转换为整数,与范围进行比较(我会让 reader 调整范围,因为我不是 excel 专家)。

def is_valid_excel_cell(c):
    m = re.match("[A-Z]+(\d+)$",c)
    return bool(m) and m.group(1).isdigit() and 0 < int(m.group(1)) < 16384

根据我的评论,有效性取决于 Excel 版本。较新版本的列范围为 A-XDF,行范围为 1-1048576。它在您的项目中可能不是必需的,但为了将来参考它可能很方便:

正则表达式模式:^([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([1-9]\d{0,6})$

形象化:

第一组捕获 Excel 2010 年及更高版本的列引用,即 A-XDF,第二组捕获应始终以 1-9 开头,后跟 0 到6 个字符,但不能超过 1048576.

所以你可以考虑完全有效:

import re
def is_valid_excel_cell(c):
    m = re.match(r'^([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([1-9]\d{0,6})$',c)
    return bool(m) and int(m.group(2)) < 1048577
import re

def is_valid_excel_cell(addr):
    m = re.match(r'^([A-Z]{1,3})([1-9]\d*)$', addr)
    if not m:
        return False
    letters, numbers = m.groups()
    if len(letters) == 3 and letters > 'XFD':
        return False
    if int(numbers) > 1048576:
        return False
    return True

仅针对 Python 3.8+ 的半压缩(由于使用了海象 (:=) 运算符):

def is_valid_excel_cell(addr):
    return (bool(m := re.match(r'^([A-Z]{1,3})([1-9]\d*)$', addr)) and
        (len(m.group(1)) < 3 or m.group(1) <= 'XFD') and 
        int(m.group(2)) <= 1048576)