python
  • regex
  • 2017-05-17 5 views 0 likes 
    0

    benötigt E-Mails in einer Zeichenfolge zu ersetzen, so:Python Regex entfernen E-Mails von String

    inp = 'abc [email protected] 123 [email protected] foo @ bar [email protected] @5555 [email protected]" 
    

    sollte in Folge:

    out = 'abc 123 foo bar" 
    

    Was regex zu benutzen?

    In [148]: e = '[^\@]\@[^\@]' 
    In [149]: pattern = re.compile(e) 
    In [150]: pattern.sub('', s) 
    Out[150]: 'one aom 123 4two' 
    In [151]: s 
    Out[151]: 'one [email protected] 123 4 @ two' 
    

    Ist für mich

    +0

    Ich würde vorschlagen, die Zeichenfolge auf Leerzeichen aufzuteilen, die Elemente des Arrays mit einem @ entfernen und die Zeichenfolge zusammenführen. Aber es ist kein Regex. – fonfonx

    +0

    Mögliches Duplikat von [Verwendung eines regulären Ausdrucks zur Überprüfung einer E-Mail-Adresse] (http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email- Adresse) – horcrux

    +0

    @fonfonx Ja, ich dachte darüber nach zu spalten, entfernen und wieder zusammenführen. Aber es scheint mir übertrieben. – dokondr

    Antwort

    3

    ersetzen:
    \S*@\S*\s?
    durch ''

    Demo here

    einige Erklärungen:
    \S*: passen so viele Nicht-Leerzeichen Sie können
    @: dann ein @
    \S*: dann eine andere Folge von Nicht-Leerzeichen Zeichen
    \s?: Und schließlich ein Leerzeichen, wenn es eins gibt. Notiere dass der '?' wird benötigt, um eine Adresse am Ende der Zeile zu finden. Wegen der Gierigkeit von "?", Wenn es ein Leerzeichen gibt, wird es immer übereinstimmen.

    +0

    Mein Fehler, es funktioniert, danke! Warum '\ s? wird gebraucht? – dokondr

    +1

    @dokondr: Wenn Sie nur '\ S * @ \ S *' verwenden, werden Ihre restlichen Wörter um mehr als ein Leerzeichen getrennt, wenn eine Adresse zwischen ihnen gelöscht wurde. Durch das Hinzufügen von '\ s?', Jedes Mal, wenn Sie eine Adresse löschen, löschen Sie ein Leerzeichen mit ihm – Gawil

    +0

    Ich habe Erklärungen hinzugefügt. Sag mir, wenn du etwas nicht verstehst – Gawil

    0

    persönlich nicht arbeite ich Parsen selbst zu tun String bevorzugen. Lassen Sie uns versuchen, die Zeichenfolge Aufspalten und immer der Elemente zu befreien, die das @ Symbol haben:

    inp = 'abc [email protected] 123 [email protected] foo @ bar [email protected] @5555 [email protected]' 
    items = inp.split() 
    

    Jetzt haben wir etwas tun können:

    >>> [i for i in items if '@' not in i] 
    ['abc', '123', 'foo', 'bar'] 
    

    Das führt uns dort fast bekommt. Lassen Sie uns ändern Sie es ein bisschen mehr hinzuzufügen ein join:

    >>> ' '.join([i for i in inp.split() if '@' not in i]) 
    'abc 123 foo bar' 
    

    Es ist nicht RegEx sein kann, aber es funktioniert für die Eingabe erhalten haben.

    0
    out = ' '.join([item for item in inp.split() if '@' not in item]) 
    
    Verwandte Themen