2010-08-24 14 views
4

J'essaie d'amincir les fichiers texte de bavardage que je reçois de mon gestionnaire de référence, car il laisse des champs supplémentaires qui finissent par être tronqués lorsque je les mets dans LaTeX.regex pour éliminer le champ dans le fichier bibtex

Une entrée caractéristique que je veux nettoyer est:

@Article{Kholmurodov:2001p113, 
author = {K Kholmurodov and I Puzynin and W Smith and K Yasuoka and T Ebisuzaki}, 
journal = {Computer Physics Communications}, 
title = {MD simulation of cluster-surface impacts for metallic phases: soft landing, droplet spreading and implantation}, 
abstract = {Lots of text here. Even more text.}, 
affiliation = {RIKEN, Inst Phys {\&} Chem Res, Computat Sci Div, Adv Comp Ctr, Wako, Saitama 3510198, Japan}, 
number = {1}, 
pages = {1--16}, 
volume = {141}, 
year = {2001}, 
month = {Dec}, 
language = {English}, 
keywords = {Ethane, molecular dynamics, Clusters, Dl_Poly Code, solid surface, metal, Hydrocarbon Thin-Films, Adsorption, impact, Impact Processes, solid surface, Molecular Dynamics Simulation, Large Systems, DL_POLY, Beam Deposition, Package, Collision-Induced Desorption, Diamond Films, Vapor-Deposition, Transition-Metals, Molecular-Dynamics Simulation}, 
date-added = {2008-06-27 08:58:25 -0500}, 
date-modified = {2009-03-24 15:40:27 -0500}, 
pmid = {000172275000001}, 
local-url = {file://localhost/User/user/Papers/2001/Kholmurodov/Kholmurodov-MD%20simulation%20of%20cluster-surface%20impacts-2001.pdf}, 
uri = {papers://B08E511A-2FA9-45A0-8612-FA821DF82090/Paper/p113}, 
read = {Yes}, 
rating = {0} 
} 

Je voudrais éliminer les champs comme mois, résumé, mots-clés, etc. dont certains sont des lignes simples et dont certains sont plusieurs lignes .

Je lui ai donné un essai en Python et comme ceci:

fOpen = open(f,'r') 
start_text = fOpen.read() 
fOpen.close() 

# regex 
out_text = re.sub(r'^(month).*,\n','',start_text) 
out_text = re.sub(r'^(annote)((.|\n)*?)\},\n','',out_text) 
out_text = re.sub(r'^(note)((.|\n)*?)\},\n','',out_text) 
out_text = re.sub(r'^(abstract)((.|\n)*?)\},\n','',out_text) 

fNew = open(f,'w') 
fNew.write(out_text) 
fNew.close() 

J'ai essayé d'exécuter ces expressions rationnelles à TextMate pour voir si elles fonctionnent avant de leur donner un essai en Python et ils semblent être ok .

Des suggestions?

Merci.

Répondre

2

Qu'en est-ce regex (appliquer avec plusieurs lignes et dotall drapeaux):

 
^(?:month|annote|note|abstract)\s*=\s*\{(?:(?!\},$).)*\},[\r\n]+ 

Explication:

 
^        # start-of-line 
(?:       # non-capturing group 1 
    month|annote|note|abstract # one of these terms 
)        # end non-capturing group 1 
\s*=\s*      # whitespace, an equals sign, whitespace 
\{       # a literal curly brace 
(?:       # non-capturing group 2 
    (?!       # negative look-ahead (if not followed by...) 
    \},$      #  a curly brace, a comma and the end-of-line 
)       # end negative look-ahead 
    .       # ...then match next character, whatever it is 
)*       # end non-capturing group 2, repeat 
\},       # a literal curly brace and a comma 
[\r\n]+      # at least one end-of-line character 

Cette seule expression trie toutes les lignes affectées en une seule étape.


EDIT/AVERTISSEMENT: Notez que cette se échoue dès le suivant se produit:

 
affiliation = {RIKEN, Inst Phys {\&}, 
Computat Sci Div, Adv Comp Ctr, Wako, Saitama 3510198, Japan}, 

structures emboîtées ne peuvent pas être traitées par des expressions régulières. Aucune solution regex pure ne peut être correcte dans tous les cas dans ce contexte, le mieux que vous puissiez obtenir est une bonne approximation. La question est de savoir si vous êtes sûr à 100% que la situation ci-dessus ne peut pas se produire (et je ne pense pas que vous pouvez l'être) - ou si vous êtes prêt à prendre le risque. Si vous n'êtes pas entièrement sûr que ce ne sera pas un problème - utilisez ou écrivez un analyseur.

+0

Oui - merci. Je pense que cela fait le travail. Et merci pour l'avertissement. Heureusement dans ce cas, je ne pense pas que je devrais rencontrer des instances qui provoquent l'expression rationnelle que vous suggérez d'échouer. – dtlussier

+0

Oh - juste une chose rapide pour quelqu'un qui voit cela plus tard. Pour utiliser les drapeaux multilignes et pointillés comme suggéré ici, vous devez d'abord compiler l'expression regex. Donc: 'text_out = re.sub (re.compile (, re.DOTALL | re.MULTILINE), , original))' Notez que pour utiliser plus d'un drapeau, vous les mettez ensemble en utilisant l'opérateur '|' ou. – dtlussier

+0

@dltussier: La compilation de l'expression rationnelle entraînera également une accélération lors de la réutilisation dans une boucle, par exemple. BTW, voyant un utilisateur de première fois qui * obtient instantanément * w/r/t question et le formatage des commentaires est un plaisir. :-) – Tomalak