我有(数千个)csv 文件,其中包含各种(数十亿)行,例如:
combos.csv
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a2c7dac3cfd2cec792e2c6cdcfc3cbcc8cd6cec6" rel="noreferrer noopener nofollow">[email protected]</a>:passw0rd
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="97f2efb9f6b9fabae7fbc8f2a6d7f3f8faf6fef9b9e3fbf3" rel="noreferrer noopener nofollow">[email protected]</a>;p@££w0r46&
0-0-0 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="36534e1857185b1b465a6953077652595b575f5818425a52" rel="noreferrer noopener nofollow">[email protected]</a> p@££w0r46&
<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b0d5c89ed19edd9dc0dcefd581f0d4dfddd1d9de9ec4dcd4" rel="noreferrer noopener nofollow">[email protected]</a>: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: "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="711409101c011d144131151e1c10181f5f051d15" rel="noreferrer noopener nofollow">[email protected]</a>" Password: "passw0rd"
Email: "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="abced385ca85c686dbc7f4ce9aebcfc4c6cac2c585dfc7cf" rel="noreferrer noopener nofollow">[email protected]</a>" Password: "p@££w0r46&"
Email: "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="482d3066296625653824172d79082c2725292126663c242c" rel="noreferrer noopener nofollow">[email protected]</a>" Password: "p@££w0r46&"
Email: "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fa9f82d49bd497d78a96a59fcbba9e95979b9394d48e969e" rel="noreferrer noopener nofollow">[email protected]</a>" 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>.*)')
我怎样才能正确地做到这一点,更好的是,是否有一种解决方案,一个正则表达式可以完成所有事情?
欢迎任何帮助!
最佳答案
如果您打算从您可能使用的每一行中提取电子邮件、密码和可选的用户名数据
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
一起使用,使用空格、;
和 :
进行分割。
关于python正则表达式提取用户名:password or email:password in mixed delimited csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54516613/