Saya mencoba mengekstrak beberapa Email dari string. Saya menggunakan regex ini: re.findall(r'[\w\.-]+@[\w\.-]+(?:\.[\w]+)+', text) Berfungsi dengan baik, tetapi terkadang dalam teks Nama email dengan domain yang sama adalah ...

3
Alex_Y 5 April 2021, 17:57

3 jawaban

Jawaban Terbaik

Kamu bisa memakai

(?:{([^{}]*)}|\b\w[\w.-]*)(@[\w.-]+\.\w+)

Lihat demo regex. Detail:

  • (?:{([^{}]*)}|\b\w[\w.-]*) - pencocokan grup yang tidak menangkap:
  • {([^{}]*)} - a {, lalu Grup 1 menangkap nol atau lebih karakter apa pun selain { dan } lalu }
  • | - atau
  • \b\w[\w.-]* - batas kata (ini akan membuat pencocokan lebih efisien), karakter kata, dan kemudian nol atau lebih karakter kata, titik, atau tanda hubung
  • (@[\w.-]+\.\w+) - Grup 2: @, satu atau lebih karakter kata, titik atau tanda hubung, lalu . dan satu karakter kata atau lebih.

Lihat demo Python:

import re
text = "Emails like {annie,bonnie}@gmail.com, annie2@gmail.com, then a bonnie2@gmail.com."
emails = []
rx_email = re.compile( r'(?:{([^{}]*)}|\b\w[\w.-]*)(@[\w.-]+\.\w+)' )
for m in rx_email.finditer(text):
    if m.group(1):
        for email in m.group(1).split(','):
            emails.append(f'{email}{m.group(2)}')
    else:
        emails.append(m.group())
print(emails)
# => ['annie@gmail.com', 'bonnie@gmail.com', 'annie2@gmail.com', 'bonnie2@gmail.com']

Logikanya adalah

  • Dapatkan email dengan {...} di depan @ sambil menangkap konten di dalam kurung ke dalam Grup 1 dan @... ke dalam Grup 2
  • Periksa apakah Grup 1 cocok, dan jika ya, pisahkan konten dengan koma dan buat kecocokan yang dihasilkan dengan menggabungkan nama pengguna yang memisahkan koma dengan bagian domain
  • Jika Grup 1 tidak cocok, cukup tambahkan nilai kecocokan ke daftar yang dihasilkan.
2
Wiktor Stribiżew 5 April 2021, 16:13
x = 'xy2@gmail.com data@gmail.com google@gmail.com {annie,bonnie}@gmail.com'
q = []
for i,j in enumerate(x):
    if '{' == j or '}' ==j :
        q.append(i)  
    
y1 = x[q[0]+1:q[1]]
a1 = y1.replace(','," ")
a1 = a1.split(" ")
z = [i+'@gmail.com' for i in a1]

x = x.replace("{",'')
y = x.replace("}",'')
z1 = " ".join(z)
z2 = y.replace(y1,z1
0
Hemanth kumar 5 April 2021, 16:12

Anda dapat menggunakan re.findall bersama dengan pemahaman daftar:

inp = "{annie,bonnie}@gmail.com"
parts = re.findall(r'\{(.*?)\}(@\S+)\b', inp)[0]
emails = [email + parts[1] for email in parts[0].split(',')]
print(emails)

Ini mencetak:

['annie@gmail.com', 'bonnie@gmail.com']
1
Tim Biegeleisen 5 April 2021, 15:04