使用Python从文件中提取ssn号、日期、电子邮件地址

2024-05-12 19:27:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

2.我想逐行提取ssn号、日期、电子邮件。我希望代码遍历每一行并返回预期的字符串。在

3.在Python中更正编码

^{pr2}$

Tags: 文件txtcom内容hhgmailfgadf
1条回答
网友
1楼 · 发布于 2024-05-12 19:27:18
  • 您正在打开文件,将其完全读取,然后使用splitlines()将读取的内容拆分为列表,然后迭代该列表。太长太复杂的过程。此外,文件在读取后不会关闭。在
  • 相反,为什么不使用with构造打开文件,然后使用readlines()完全读取文件。不需要拆分行,也不必担心关闭文件。在
  • 在您的代码中,一旦开始逐行迭代,您将再次基于单个空格拆分行,然后将split的输出传递给您的函数,该函数将提取date/email/ssn。问题就在这里。在
  • 不需要按空格分割线。将该行直接传递给函数以提取数据。在
  • 你的正则表达式很好。我没有修改它。在
  • 我已经用search函数替换了findall函数。下面的例子解释了两者之间的区别。在
 >>> import re
 >>> a = "Dinesh 123"

 >>> t = re.search(r"\d+",a)

 >>> t <_sre.SRE_Match object at 0x01FE3918>

 >>> t.group() 
 >>> '123'


 >>> x = re.findall(r'\d+',a)
 >>> x
 >>> ['123']

如需更多帮助,请查看此link!!!在

以上各点均在以下代码中列出:

代码:

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

输出:

^{pr2}$

相关问题 更多 >