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

检查Python字符串是否为有效的Excel单元格,python,excel,string,openpyxl,Python,Excel,String,Openpyxl,给定Python中的一些字母数字字符串,例如 A9 B44B C101 4D4 我如何检查字符串是否是有效的Excel单元格(即,字母在数字之前) 我尝试使用.isalpha和.isdigit方法“收集”字母和数字,然后使用.index检查是否所有字母都出现在数字之前,但我的逻辑变得太复杂了,我觉得我没有考虑所有的可能性 有没有一个简单的方法来实现这一点 预期结果: >>> is_valid_excel_cell('A9') True >>> is_val

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

  • A9
  • B44B
  • C101
  • 4D4
我如何检查字符串是否是有效的Excel单元格(即,字母在数字之前

我尝试使用
.isalpha
.isdigit
方法“收集”字母和数字,然后使用
.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)
检查单元格内容是否以大写字母开头,以数字结尾

现在,如果第1步需要进行范围检查,则可以提取数字并将其转换为整数,与范围进行比较(我将让读者调整范围,因为我不是excel专家)

def是有效的excel单元格(c):
m=重新匹配(“[A-Z]+(\d+$”,c)
返回bool(m)和m.group(1).isdigit()和0
根据我的评论,有效性取决于Excel版本。较新版本的列范围为
a-XDF
,行范围为
1-1048576
。在您的项目中可能不需要它,但对于将来的参考,它可能很方便:

正则表达式模式:
^([A-Z]{1,2}{124;[A-W][A-Z]{2}{124; 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
重新导入
def是有效的excel单元格(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)
返回布尔(m)和整数(m.group(2))<1048577
仅针对Python 3.8+进行了半压缩(由于使用了walrus(
:=
)运算符):

def是有效的excel单元格(addr):
返回(bool(m:=re.match(r'^([A-Z]{1,3})([1-9]\d*)$,addr))和

(len(m.group(1))<3或m.group(1)注意:要记住,有效性可能取决于excel版本。例如:Excel2003只有256列65536行,而较新版本有16384列和1048676行。正则表达式可能是最好的选择:
re.match([A-Z]+\d+$,cellcontent)
公平地说,您只关心检测字母在数字之后的位置吗?@JvdV您是对的,尽管这对我的用例来说不是问题。我没有解释这一点,但我不是要将Excel文件写回内存,只是读取它的值(
openpyxl
允许访问超出Excel限制的单元格,尽管它们都存储
None
值)。@pip是的,尽管我想检查它是否是实际的Excel单元格(即
'1'
'A'
应该返回
False,因为这些是Excel列/行,而不是单元格)。非常感谢,这完全符合预期。当然,答案将涉及正则表达式…:)如果你不介意的话,我已经在你的伟大答案中添加了一些更广泛的正则表达式模式。非常聪明地使用了检查字母与XFD的方法,+。看起来一组答案正是OP可以使用的:
m=re.match(r'^([a-Z]{1,3})([1-9]\d{0,6})$,c)
返回bool(m)和m.group(1)<'XFE'和int(m.group(2))<1048577
@JvdV:
'ZZ'
为假,因此只有在第1组长度为3时才应检查。一旦我在你的答案中看到它,我非常喜欢缩短它的想法,但最终我决定让它保持原样,以便让OP明白逻辑。虽然我现在不需要这个功能,但我同意他是对我的问题的更全面的回答。谢谢!
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
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)