2011-04-06 5 views
0

Je dois importer une grande quantité de codes de construction d'un fichier texte vers une base de données SQL. Jusqu'à présent, j'ai écrit le code suivant qui renvoie avec succès le numéro de code et le titre. Comment puis-je faire correspondre le texte après le titre d'un code au début du code suivant?Utilisation d'expressions régulières pour importer une grande quantité de données

Test.txt:

101,1 Titre. Ceci est un exemple de code.

101.1.2 Frais locaux. La juridiction locale peut imposer des frais pour les permis de construire violations en vertu de l'article 300.1.

import re 

file=open(r'C:\Test.txt','r') 
text=file.read() 

codes=re.findall('(\d{3,4}.[\d.]+?){1}\s([\w\s]+[.]){1}',text) 
for code in codes: 
    print code[0],code[1] 

Il en résulte:

101,1 Titre. Je voudrais avoir le code [3] print 'Ceci est un exemple de code.'

101.1.2 Frais locaux.

Répondre

3

Utilisez re.split au lieu de re.findall. Dans votre cas:

>>> re.split('(\d{3,4}.[\d.]+?){1}\s([\w\s]+[.]){1}',text) 

['', '101.1', 'Title.', ' This is an example code.\n\n', '101.1.2', 'Local Fees.', ' The local jurisdiction may charge fees for building permit violations per Section 300.1.\n'] 
0

Il me semble que votre titre de votre enregistrement est le texte entre le dernier nombre (si vous incrémentez sur les caractères chaînes), et la première période qui n'est ni précédée d'un nombre ni suivie par un. En utilisant ceci, vous pouvez prendre la ligne entière et déterminer la position de la période qui sépare les deux parties de l'enregistrement et les diviser en fonction de cela. Ensuite, mettez en cache les deux chaînes en tant que paire ou insérez-les directement dans votre base de données. Si votre fichier ne fait que construire des codes que vous voulez extraire et ne contient aucune autre donnée inutile, je vous suggère de mettre au rebut les expressions régulières et d'utiliser cette approche.

0

Je voudrais utiliser la folowing (non testé)

codes=re.findall('^(\d{3,4}.[\d.]+?)\s([\w\s]+[.])\s+(.*)$',text,re.MULTILINE) 

Notez que {1} est inutile

0
import sys 
import re 

SECTION = r'\d{3,4}\.[\d.]*' 
LABEL = r'[^.\r\n]*' 
TITLE = re.compile(r'^({section})\s*({label})\W*'.format(section=SECTION, label=LABEL), re.MULTILINE) 

def process(fname): 
    with open(fname, 'r') as inf: 
     txt = inf.read() 
    res = TITLE.split(txt) 
    it = iter(res) 
    it.next()   # discard leading text 
    return zip(it, it, it) 

def main(): 
    args = sys.argv[1:] or ['c:/test.txt'] 
    for fname in args: 
     res = process(fname) 
     # do something with res 

if __name__=="__main__": 
    main() 

Course contre votre test.txt, ce rendement

[ 
    ('101.1', 'Title', 'This is an example code.\n\n'), 
    ('101.1.2', 'Local Fees', 'The local jurisdiction may charge fees for building permit violations per Section 300.1.\n\n') 
] 
Questions connexes