2009-12-12 4 views
0

J'essaie de créer des expressions régulières pour filtrer certains textes d'un fichier texte. Ce que je veux filtrer a ce format:Comment créer une expression régulière en Python?

word_*_word.word 

Ainsi, par exemple, je voudrais le code python chaque match. Les résultats d'échantillon seraient:

program1_0.0-1_log.build 
program2_0.1-3_log.build 

Comment est-ce que je peux faire ceci?

Merci beaucoup pour votre aide

Répondre

3

Essayez quelque chose comme ceci:

r'[a-zA-Z0-9]+_[^_]+_[a-zA-Z0-9]+\.[a-zA-Z0-9]+' 
0

essayer avec ^\w+_.*_\w+\.\w+$

+0

Vous ne serez pas « chaque match », comme les désirs OP, en ancrant le modèle afin qu'elle corresponde à seulement une ligne entière (si vous vous souveniez de spécifier 're .MULTILINE' - sinon, seulement le fichier entier, et seulement s'il n'y avait pas de saut de ligne si vous ne spécifiez pas 're.DOTALL' ;-). –

1

module d'expression régulière de Python est appelé re. Vous devez importer et utiliser le provided functions:

import re 
if re.match(r'\w+_.*_\w+.\w+', "some_text_abc.x"): 
    print "yeah." 

Il est utile de préfixe la chaîne d'expression régulière avec r, de sorte qu'il sera interprété littéralement, sans manipulation particulière pour les caractères d'échappement. Sinon, les barres obliques inverses seront traitées spécialement par l'interpréteur python et les barres obliques inverses qui font partie de l'expression régulière doivent être échappées.

+0

Ceci correspond à "un nombre quelconque de traits de soulignement" qui semble particulier (et ne satisfait pas l'exemple de l'OP). –

+0

@Alex: Vous avez absolument raison, j'ai corrigé le fait que – sth

+0

@sth, tx - aussi, 're.match' ne correspond qu'au début de la chaîne (comme si le motif commençait par un'^'implicite, dans un sens) donc il ne recevra probablement pas "toutes les correspondances" dans le fichier comme le demande l'OP. –

2

On dirait que vous voulez utiliser un motif tel que r'\w+_.*_\w+\.\w+' - en supposant que vous avez * ne se « zéro ou plusieurs caractères totalement arbitraire » (sinon, la partie .* au milieu doit être modifiée en conséquence). Une fois que vous avez le bon modèle (dépendant exactement de ce que vous entendez par * ;-), vous pouvez le re.compile pour obtenir un objet d'expression régulière, et utiliser la méthode .findall de l'objet RE, avec votre chaîne globale comme argument, pour obtenir une liste de toutes les sous-chaînes non-chevauchantes correspondant à ce modèle (il existe également des alternatives telles que par exemple .finditer si vous souhaitez obtenir une telle sous-chaîne à la fois, en boucle sur eux).

0

Je ne comprends pas pourquoi vous auriez besoin d'une regex ici. Si les chaînes que vous voulez termine par « .build », vous pouvez le faire par exemple

s="blah blah program1_0.0-1_log.build blah blah"  
for item in s.split(): 
    if item.endswith(".build"): 
     print item 

et c'est tout. Si vous voulez faire de nouvelles vérifications, puis

for item in s.split(): 
    if item.endswith(".build"): 
     s = item.split("_") 
     if len(s) != 3: 
      print "not enough _" 
+0

vous pourriez préférer utiliser une regex pour trouver les choses avec 1 ligne de code, par opposition à vos boucles multi-lignes. –

+0

J'utilise rarement regex avec Python, sauf si absolument nécessaire. L'utilisation des méthodes de chaînes internes de Python est également plus rapide, IMO. – ghostdog74

Questions connexes