使用Python从文件中提取ssn号、日期和电子邮件地址
1.我有一个名为使用Python从文件中提取ssn号、日期和电子邮件地址,python,fileparsing,Python,Fileparsing,1.我有一个名为rexp.txt的文件,内容如下: adf fdsf hh h fg h 1995-11-23 dasvsbh 2000-04-12 gnym,mnbv 2001-02-17 dascvfbsn bjhmndgfh xgfdjnfhm244-44-2255 fgfdsg gfjhkh fsgfdh 455-44-6577 dkjgjfkld sgf dgfdhj sdg 192.6.8.02 fdhdlk dfnfghr fisdhfih dfhghihg 154.56.2
rexp.txt的文件,内容如下:
adf fdsf hh h fg h 1995-11-23
dasvsbh 2000-04-12 gnym,mnbv 2001-02-17
dascvfbsn
bjhmndgfh
xgfdjnfhm244-44-2255 fgfdsg gfjhkh
fsgfdh 455-44-6577 dkjgjfkld
sgf
dgfdhj
sdg 192.6.8.02 fdhdlk dfnfghr
fisdhfih dfhghihg 154.56.2.6 fdhusdgv
aff fjhgdf
fdfdnfjgkpg
fdf hgj fdnbk gjdhgj
dfdfg raeh95@gmail.com efhidhg fdfuga reg@gmail.com
ergudfi rey@gmail.com iugftudfh dgufidjfdg
teeeee@gmail.comugfuhlfhs fgufif p
import re
def cfor_date(tmp_line):
t=re.findall(r'(\d{4}-\d{2}-\d{2})',tmp_line)
return t
def cfor_ssn(tmp_line):
f=re.findall(r'(\d{3}-\d{2}-\d{4})',tmp_line)
return f
def cfor_gm(tmp_line):
g=re.findall(r'([\w\.-]+@gmail[\w{3}\.-]+)',tmp_line)
return g
with open("xyz.txt","r") as fh:
for line in fh.readlines():
date_list = cfor_date(line)
ssn_list = cfor_ssn(line)
gm_list = cfor_gm(line)
if len(ssn_list) != 0:
print ssn_list
if len(date_list) != 0:
print date_list
if len(gm_list) != 0 :
print gm_list
C:\Users\dinesh_pundkar\Desktop>python c.py
['1995-11-23']
['2000-04-12', '2001-02-17']
['244-44-2255']
['455-44-6577']
['raeh95@gmail.com', 'reg@gmail.com']
['rey@gmail.com']
['teeeee@gmail.comugfuhlfhs']
C:\Users\dinesh_pundkar\Desktop>
2.我想逐行提取ssn号、日期、电子邮件。我期望代码在每一行中循环并返回期望的字符串
3.更正Python中的编码:
import re
def cfor_date(str):
t=re.search(r'(\d{4}-\d{2}-\d{2})',str)
return t
def cfor_ssn(str):
f=re.search(r'(\d{3}-\d{2}-\d{4})',str)
return f
def cfor_gm(str):
g=re.search(r'([\w\.-]+@gmail[\w{3}\.-]+)',str)
return g
f = open("rexp.txt","r").read()
lines = f.splitlines()
for line in iter(lines):
x=line.split(" ")
print x
if (cfor_date(x)) != None: # i feel problem here
r=cfor_ssn(x)
print r
- 您正在打开文件,完全读取它,然后使用
将读取的内容拆分到列表中,然后在该列表上迭代。太长太复杂的过程。此外,文件读取后不会关闭splitlines()
- 与此相反,为什么不使用
构造打开文件,然后使用和
完全读取文件。不需要分割行,也不需要担心关闭文件readlines()
- 在您的代码中,一旦开始逐行迭代,您将再次在单个空格的基础上拆分行,然后将拆分的输出传递给函数,以提取日期/电子邮件/ssn。这就是问题所在
- 不需要基于空格分割线。将该行直接传递给函数以提取数据
- 你的正则表达式很好。我没有修改它
- 我已将
功能替换为search
功能。下面的例子解释了两者之间的区别findall
adf fdsf hh h fg h 1995-11-23
dasvsbh 2000-04-12 gnym,mnbv 2001-02-17
dascvfbsn
bjhmndgfh
xgfdjnfhm244-44-2255 fgfdsg gfjhkh
fsgfdh 455-44-6577 dkjgjfkld
sgf
dgfdhj
sdg 192.6.8.02 fdhdlk dfnfghr
fisdhfih dfhghihg 154.56.2.6 fdhusdgv
aff fjhgdf
fdfdnfjgkpg
fdf hgj fdnbk gjdhgj
dfdfg raeh95@gmail.com efhidhg fdfuga reg@gmail.com
ergudfi rey@gmail.com iugftudfh dgufidjfdg
teeeee@gmail.comugfuhlfhs fgufif p
import re
def cfor_date(tmp_line):
t=re.findall(r'(\d{4}-\d{2}-\d{2})',tmp_line)
return t
def cfor_ssn(tmp_line):
f=re.findall(r'(\d{3}-\d{2}-\d{4})',tmp_line)
return f
def cfor_gm(tmp_line):
g=re.findall(r'([\w\.-]+@gmail[\w{3}\.-]+)',tmp_line)
return g
with open("xyz.txt","r") as fh:
for line in fh.readlines():
date_list = cfor_date(line)
ssn_list = cfor_ssn(line)
gm_list = cfor_gm(line)
if len(ssn_list) != 0:
print ssn_list
if len(date_list) != 0:
print date_list
if len(gm_list) != 0 :
print gm_list
C:\Users\dinesh_pundkar\Desktop>python c.py
['1995-11-23']
['2000-04-12', '2001-02-17']
['244-44-2255']
['455-44-6577']
['raeh95@gmail.com', 'reg@gmail.com']
['rey@gmail.com']
['teeeee@gmail.comugfuhlfhs']
C:\Users\dinesh_pundkar\Desktop>
你们能在重复列表的地方共享数据吗?在谷歌硬盘或下拉框上共享文件。只需给我链接在阅读文件并打印上一个程序中的某些内容后,我需要一个单独的用户定义函数,在这些行上循环并在第一行提取我['1995-11-23','244-44-2255'.['2000-04-12','2001-02-17','455-44-6577']在第二行,循环继续…你能给出有上述数据的行吗?上一个程序的输出:['1995-11-23']['2000-04-12','2001-02-17']['244-44-2255']['455-44-6577']。我需要单独的用户定义函数在第一行选择['1995-11-23','244-44-2255']。[2000-04-12'、'2001-02-17'、'455-44-6577']在第二行,循环继续。。。