2017-12-22 6 views
0

Der Versuch, nur die E-Mail-Adresse aus diesem Format zu extrahieren:Python Regex verursacht Listenindex außerhalb des zulässigen Bereichs Fehler

John Smith <[email protected]>

Ich habe die beiden folgenden versucht, und es ergibt sich der gleiche Fehler:

IndexError: list index out of range

email_address = re.findall('(?<=\<)\[email protected][a-zA-Z]+\.[a-z]+(?=\>)', sender)[0] 

email_address = re.findall('<([^>])>', sender)[0] 

Übriges Code:

import webapp2 
import logging 
from google.appengine.ext.webapp import mail_handlers 
from google.appengine.api import mail 
import os 
from main import WorkRequest 
import re 


class IncomingMailHandler(mail_handlers.InboundMailHandler): 
    def receive(self, message): 
     (encoding, payload) = list(message.bodies(content_type='text/plain'))[0] 
     body_text = payload.decode() 
     logging.info('Received email message from %s, subject "%s": %s' % 
        (message.sender, message.subject, body_text)) 

     logging.info (message.sender) 
     logging.info(message.subject) 
     logging.info(body_text) 


     sender = str(message.sender) 

     email_address = re.findall('<([^>])>', sender)[0] 

     wr = WorkRequest() 

     wr.email = email_address 
     wr.userId = None 
     wr.title = message.subject 
     wr.content = body_text 
     wr.status = "OPEN" 
     wr.submission_type = "EMAIL" 
     wr.assigned_to = "UNASSIGNED" 
     wr.put() 

application = webapp2.WSGIApplication([('/_ah/mail/.+', IncomingMailHandler)],debug=True) 

Kann mir bitte jemand helfen? Ich verwende Google App Engine mit Python, wenn dies wichtig ist.

+3

können Sie tun 'print (Sender)' und die Ausgabe zu Ihrer Frage hinzufügen? – hansaplast

+0

die Regex sieht gut aus, es wird 'jsmith @ email.com' aus' 'John Smith <[email protected]>" ' – hansaplast

+1

Die erste Regex funktioniert für mich (angenommen der Absender ist' John Smith <[email protected] > '). Die zweite funktioniert, wenn Sie nach der schließenden eckigen Klammer ein Pluszeichen hinzufügen. –

Antwort

1

In meinem Fall erster Regex funktioniert:

>>> sender = 'John Smith <[email protected]>' 
>>> email_address = re.findall('(?<=\<)\[email protected][a-zA-Z]+\.[a-z]+(?=\>)', 
     sender)[0] 
>>> email_address 
'[email protected]' 

Zweitens ist ungültig, da Sie leere Liste als Ergebnis erhalten, so dass Sie nicht Artikel bei Index 0 bekommen:

email_address = re.findall('<([^>])>', sender) 
>>> email_address 
[] 

Sie kann überprüfen Sie Ihre Regex um http://rubular.com/ Es ist kostenlos und einfach zu bedienen.

invalid

valid

Verwandte Themen