Python регулярное выражение для извлечения имени пользователя: пароль или адрес электронной почты: пароль в CSV с разделителями - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть (тысячи) CSV-файлов, содержащих ассортимент (миллиарды) строк, таких как:

combos.csv

example0@domain.tld:passw0rd
ex.a.m-pl_e1@domain.tld;p@££w0r46&
0-0-0 ex.a.m-pl_e1@domain.tld p@££w0r46&
ex.a.m-pl_e1@domain.tld:00-00-00;p@££w0r46& <-- updated line
00-00-00:username:password
username:p@££w0r46&
username p@££w0r46&
and more...

Я пытаюсь извлечь электронную почту или имя пользователя ипароль для некоторого машинного обучения, которое я делаю.Но я не могу придумать правильное регулярное выражение для этого.

с использованием re.split, re.findall или re.search, кажется, варианты здесь, и я пытаюсь скомпилировать регулярное выражение, которое позволитмне просто напечатать, например:

Email: "example0@domain.tld" Password: "passw0rd"
Email: "ex.a.m-pl_e1@domain.tld" Password: "p@££w0r46&"
Email: "ex.a.m-pl_e1@domain.tld" Password: "p@££w0r46&"
Email: "ex.a.m-pl_e1@domain.tld" Password: "p@££w0r46&"
Username: "username" Password: "password"
Username: "username" Password: "p@££w0r46&"
Username: "username" Password: "p@££w0r46&"

Из вышеперечисленного combos.csv

Мне удалось использовать следующую комбинацию для электронной почты и пароля:

re.compile(r'(?:.*[:|;])?(?P<email>[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)[:|;](?P<Password>.*)')

но извлечь имя пользователя / пароль мне пока не удалось.Я пытался с оглядкой на;и: но, похоже, что когда строка будет разделена дважды, мое текущее регулярное выражение вернет первый столбец в качестве имени пользователя и два следующих в качестве пароля:

re.compile(r'^(?:.*[:|;])?(?P<username>[A-z0-9\.\-\_\$\#\&]+)(?!@)[:|;](?P<password>.*)')

Как я могу сделать это правильно, и еще лучше,Есть ли решение, где один регулярное выражение может сделать все?

Любая помощь будет приветствоваться!

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Если вы планируете извлекать электронную почту, пароль и дополнительные данные имени пользователя из каждой строки, которую вы можете использовать

import re
rx = re.compile(r'[:; ]')
rx_email = re.compile(r'\S+@\S+\.\S+$')
with open(your_file, "r") as f:
    for line in f:
        fields = rx.split(line)
        email = ''
        id = ''
        for field in fields:
            if rx_email.match(field):
                email = field
            elif field != fields[-1]:
                id = field
        password = fields[-1]
        print("Username: '{}', email: '{}', password: '{}'".format(id, email, password))

См. эту демонстрацию Python .

The ^\S+@\S+\.\S+$ pattern соответствует почтовым полям, которые начинаются с 1+ непробельных символов, затем имеют @, опять же 1+ непробельных символов, `.и заканчиваются 1+ непробельными символами.

Шаблон [:; ], используемый с re.split, разделяется пробелами, ; и :.

0 голосов
/ 04 февраля 2019

Как примерно так:

import re

with open('file.csv', 'r') as f:
    rows = f.readlines()

data = [re.split(r'\s|;|:', row) for row in rows]
# remove the 00-00-00 bits
clean_data = [filter(lambda x: re.match(r'(0+\-+)+', x) == None, d)[:-1]
              for d in data]

mail_regex = r'[^@]+@[^@]+\.[^@]+'

for d in clean_data:
    if re.match(mail_regex, d[0]) is not None:
        print 'Email: "{}" Password: "{}"'.format(d[0], d[1])
    else:
        print 'Username: "{}" Password: "{}"'.format(d[0], d[1])

Который производит:

Email: "example0@domain.tld" Password: "passw0rd"
Email: "ex.a.m-pl_e1@domain.tld" Password: "p@££w0r46&"
Email: "ex.a.m-pl_e1@domain.tld" Password: "p@££w0r46&"
Email: "ex.a.m-pl_e1@domain.tld" Password: "p@££w0r46&"
Username: "username" Password: "password"
Username: "username" Password: "p@££w0r46&"
Username: "username" Password: "p@££w0r46&"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...