Проверьте, является ли строка Python допустимой ячейкой Excel - PullRequest
2 голосов
/ 19 марта 2020

Учитывая некоторые буквенно-цифровые строки в Python, такие как

  • A9
  • B44B
  • C101
  • 4D4

как проверить, является ли строка действительной ячейкой Excel (т. Е. буквы идут перед числами )?

Я пытался использовать .isalpha и .isdigit методы для "сбора" букв и цифр, а затем с помощью .index, чтобы проверить, появляются ли все буквы перед цифрами, но мой лог c становится слишком сложным, и я чувствую, что я не учет всех возможностей.

Есть ли простой способ добиться этого?

Ожидаемый результат:

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

Ответы [ 3 ]

4 голосов
/ 19 марта 2020

Согласно моему комментарию, срок действия зависит от версии 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})$

Для визуализации этого:

Regular expression visualization

В первой группе указывается ссылка на столбец для Excel 2010 и более поздних версий, равная A-XDF, а во второй группе указывается часть числительного c, которая всегда должна начинаться с 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
3 голосов
/ 19 марта 2020

Я бы использовал регулярные выражения, хорошо подходящие для задачи:

import re

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

, который проверяет, начинается ли содержимое ячейки с заглавной буквы и заканчивается на ди git.

Теперь, если для числа требуется проверка диапазона, потребуется еще один шаг, можно извлечь цифры и преобразовать их в целое число, сравнить с диапазоном (я позволю читателю настроить диапазон, поскольку я не преуспел эксперт).

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
1 голос
/ 19 марта 2020
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)
...