2017-01-21 11 views
1

То, что я пытаюсь сделать: Существует большой лист Excel с большой случайной информацией о клиентах. Я хочу сортировать адрес электронной почты и другие данные в заданном формате в новом файле excel.Как совместить текст в ячейке с регулярным выражением и сохранять только текст, соответствующий регулярному выражению?

Я не могу понять, как сопоставить текст ячейки (который будет иметь некоторый формат, такой как адрес электронной почты, сжимаемый и похожий) с регулярным выражением и сохранить только данные регулярного выражения в списке.

Поблагодарили бы за помощь. Благодаря

import sys, os, openpyxl 
def sort_email_from_xl(): 
    sheet = sheet_select() #Opens the worksheet 
    emailRegex = re.compile(r'''([a-zA-Z0-9._%+-][email protected]+[a-zA-Z0-9.-]+(\.[a-zA-Z]{2,4}))''',re.VERBOSE) 
    customeremails = [] 
    for row in range(0, max_row): 
     if cell.text == emailRegex: 
      mail = cell.text 
      customeremails.append(mail) 
      return customeremails 
    print(customeremails) 

ответ

2

Этот код должен работать (я только мог проверить регулярки части, хотя):

import sys, os, openpyxl 
def sort_email_from_xl(): 
    sheet = sheet_select() #Opens the worksheet 
    emailRegex = re.compile(".*?([a-zA-Z0-9\._%+\-][email protected][a-zA-Z0-9.\-]+\.[a-zA-Z]{2,4}).*?") 
    customeremails = [] 
    for row in range(0, max_row): 
     if emailRegex.match(cell.text): 
      mail = emailRegex.match(cell.text).groups()[0] 
      cell.text = mail 
      customeremails.append(mail) 
    print(customeremails) 

Существовало много проблем с вашим кодом. Сначала о регулярном выражении:

  • регулярное выражение не позволяя текст вокруг вашего адреса электронной почты, добавив, что с .*? в начале и в конце
  • вам не нужна re.VERBOSE часть, как вам нужно только, если вам хочет добавить встроенные комментарии к вашему регулярному выражению, see doc
  • вы позволили адреса электронной почты со многими @ между
  • вы соответствовали ДВОЙ отдельно, это ненужный

Теперь регулярное выражение для электронной почты работает для основного использования, но я бы решительно рекомендовал использовать проверенное регулярное выражение для электронной почты из других ответов в Stackoverflow.

После этого: с emailRegex.match(cell.text) вы можете проверить, соответствует ли cell.text вашему регулярному выражению, а с emailRegex.match(cell.text).groups()[0] вы извлекаете только подходящую деталь. У вас тоже было одно заявление return.

For some reason the above code is giving me a NameError: name 'max_row' is not defined

Вам необходимо исправить петлю через строки, например. например documented here

+0

спасибо, что изучаю все ошибки, которые я сделал. По какой-то причине приведенный выше код дает мне имя NameError: name 'max_row' не определено'. Я предположил, что это потому, что я должен был использовать 'sheet.max_row'. Пробовал это, и теперь я получаю объект AttributeError: 'str' не имеет атрибута max_row''. Я просто просмотрел документы, и я думаю, что это может быть потому, что я вызываю лист с именем, которое я назначил, а не с Листом2. Есть ли способ обойти это? Я бы скорее назвал лист с именем, которое я назначил. – Sid

+1

@sid да, код вокруг цикла for также нуждается в исправлениях, я добавил ссылку на базовый скрипт python в ответ – hansaplast

+0

Нет, Sheet2, похоже, не проблема. Протестировано, и теперь он говорит: Sheet2 не существует. – Sid

 Смежные вопросы

  • Нет связанных вопросов^_^