检查 Python 字符串是否为有效的 Excel 单元格
Check if a Python string is a valid Excel cell
给定 Python 中的一些字母数字字符串,例如
A9
B44B
C101
4D4
如何检查字符串是否是有效的 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)
给定 Python 中的一些字母数字字符串,例如
A9
B44B
C101
4D4
如何检查字符串是否是有效的 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)