python regex提取混合定界csv中的username:password或email:password

时间:2019-02-04 12:55:36

标签: python regex csv

我有成千上万的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.splitre.findallre.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 :(得分:1)

怎么样呢?

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&"

答案 1 :(得分:1)

如果您打算从每行中提取电子邮件,密码和可选的用户名数据

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))

请参见this Python demo

^\S+@\S+\.\S+$模式与类似电子邮件的字段匹配,该字段以1+个非空白字符开头,然后是@,又是1+个非空白字符`。并以1+个非空白字符结尾。

[:; ]一起使用的re.split模式用空格;:分开。