2017-01-21 4 views
1

Was ich versuche zu tun: Es gibt ein großes Excel-Blatt mit vielen zufälligen Kundeninformationen. Ich möchte die E-Mail-Adresse und andere Daten in einem festgelegten Format in einer neuen Excel-Datei sortieren.Wie Text in einer Zelle zu Regex übereinstimmen und nur den Text beibehalten, der Regex entspricht?

Ich kann nicht ganz herausfinden, wie man den Zellentext (der ein Format wie Adressen-E-Mail-Squished togethe und ähnliches haben wird) mit der Regex und nur die Regex-Daten in einer Liste übereinstimmen.

Würde wirklich einige Hilfe zu schätzen wissen. Dank

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) 

Antwort

2

Dieser Code sollte funktionieren (ich nur den Regex Teil obwohl testen kann):

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) 

Es gab viele Probleme mit Ihrem Code. Zuerst über die regex:

  • die Regex nicht Text um Ihre E-Mail-Adresse, über die wurde, fügte hinzu, dass und mit .*? beim Start
  • Sie den re.VERBOSE Teil müssen nicht am Ende, wie Sie es nur, wenn Sie brauchen würde, wollen Inline-Kommentare zu Ihrem regulären Ausdruck hinzufügen, see doc
  • Sie erlaubt E-Mail-Adressen mit vielen @ zwischen
  • Sie die TLD separat angepasst, das ist nicht mehr benötigte

Jetzt funktioniert die E-Mail-Regex für die grundlegende Verwendung, aber ich würde definitiv empfehlen, eine bewährte E-Mail-Regex von anderen Antworten auf Stackoverflow zu nehmen.

Dann: mit emailRegex.match(cell.text) können Sie überprüfen, ob die cell.text Ihre Regex entspricht und mit emailRegex.match(cell.text).groups()[0] extrahieren Sie nur das passende Teil. Sie hatten eine return Aussage auch zu viel.

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

Sie müssen die Schleife durch die Reihen korrigieren z.B. wie documented here

+0

danke ich sehe mir alle Fehler an, die ich gemacht habe. Aus irgendeinem Grund gibt mir der obige Code einen 'NameError: Name 'max_row' ist nicht definiert '. Ich nahm an, dies ist, weil ich stattdessen 'sheet.max_row' hätte verwenden sollen. Versuchte es und jetzt bekomme ich 'AttributeError: 'str' Objekt hat kein Attribut 'max_row''. Ich bin gerade durch die Dokumente gegangen und ich denke, es könnte sein, weil ich das Blatt mit dem Namen anrufe, den ich zugewiesen habe, anstatt ein Blatt2. Gibt es einen Weg dahin? Ich würde eher das Blatt mit dem Namen, den ich zugewiesen habe, nennen. – Sid

+1

@sid ja, der Code um die for-Schleife benötigt auch Korrekturen, ich fügte einen Link zu einem grundlegenden Python-Skript innerhalb der Antwort – hansaplast

+0

Nein, das Sheet2 scheint kein Problem zu sein. Getestet und jetzt heißt es: Sheet2 existiert nicht. – Sid