2016-09-18 2 views
-2

1. J'ai un fichier nommé rexp.txt avec le contenu suivant:.Extraction de ssn non, la date, l'adresse e-mail à partir d'un fichier en utilisant Python

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 [email protected] efhidhg fdfuga [email protected] 
ergudfi [email protected] iugftudfh dgufidjfdg 
[email protected] fgufif p 

2.I veulent extraire le ssn numéro, date, e-mail ligne par ligne. Je m'attends à du code qui boucle à travers chaque ligne et renvoie les chaînes attendues.

3. Corriger le codage en 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\.-][email protected][\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 

Répondre

1
  • Vous l'ouverture du fichier, la lecture complètement, puis diviser ce qui est lu dans la liste à l'aide splitlines() et itérer puis sur cette liste. Trop de processus long et compliqué. En outre, le fichier n'est pas fermé après sa lecture. Au lieu de cela, pourquoi ne pas ouvrir le fichier en utilisant with construire, puis lire complètement le fichier en utilisant readlines(). Pas besoin de diviser les lignes et pas besoin de s'inquiéter de la fermeture du fichier.
  • Dans votre code, une fois que vous avez commencé à répéter ligne par ligne, vous fractionnez à nouveau la ligne sur la base d'un seul espace et vous passez la sortie de split qui vous liste pour extraire date/email/ssn. Ici, où le problème est.
  • Pas besoin de diviser la ligne en fonction des espaces. Passez la ligne directement aux fonctions pour extraire les données.
  • Vos expressions régulières sont bonnes. Je ne l'ai pas modifié. J'ai remplacé la fonction search par la fonction findall. La différence entre les deux est expliquée dans l'exemple ci-dessous.
>>> 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'] 

Pour plus d'aide, consultez cette link !!!

Tous les points ci-dessus sont présents dans le code ci-dessous:

code:

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\.-][email protected][\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 

Sortie:

C:\Users\dinesh_pundkar\Desktop>python c.py 
['1995-11-23'] 
['2000-04-12', '2001-02-17'] 
['244-44-2255'] 
['455-44-6577'] 
['[email protected]', '[email protected]'] 
['[email protected]'] 
['[email protected]'] 

C:\Users\dinesh_pundkar\Desktop> 
+0

Pouvez-vous partager des données où vous recevez des listes répétées? –

+0

Fichier. Courir contre le code. –

+0

Partager un fichier sur Google Drive ou une boîte de dépôt. Il suffit de me donner le lien –