Match multiligne regex dans le fichier objet
Comment puis-je extraire les groupes à partir de cette expression à partir d'un fichier objet (data.txt)?
import numpy as np
import re
import os
ifile = open("data.txt",'r')
# Regex pattern
pattern = re.compile(r"""
^Time:(\d{2}:\d{2}:\d{2}) # Time: 12:34:56 at beginning of line
\r{2} # Two carriage return
\D+ # 1 or more non-digits
storeU=(\d+\.\d+)
\s
uIx=(\d+)
\s
storeI=(-?\d+.\d+)
\s
iIx=(\d+)
\s
avgCI=(-?\d+.\d+)
""", re.VERBOSE | re.MULTILINE)
time = [];
for line in ifile:
match = re.search(pattern, line)
if match:
time.append(match.group(1))
Le problème dans la dernière partie du code, c'est que je itérer ligne par ligne, ce qui évidemment ne fonctionne pas avec multiligne regex. J'ai essayé d'utiliser pattern.finditer(ifile)
comme ceci:
for match in pattern.finditer(ifile):
print match
... juste pour voir si ça fonctionne, mais le finditer méthode nécessite une chaîne de caractères ou un tampon.
J'ai aussi essayé cette méthode, mais ne peut pas le faire fonctionner
matches = [m.groups() for m in pattern.finditer(ifile)]
Une idée?
Après le commentaire de Mike et Tuomas, on m'a dit de l'utiliser .read().. quelque Chose comme ceci:
ifile = open("data.txt",'r').read()
Cela fonctionne bien, mais serait-ce la bonne façon de chercher dans le fichier? Pouvez pas le faire fonctionner...
for i in pattern.finditer(ifile):
match = re.search(pattern, i)
if match:
time.append(match.group(1))
Solution
# Open file as file object and read to string
ifile = open("data.txt",'r')
# Read file object to string
text = ifile.read()
# Close file object
ifile.close()
# Regex pattern
pattern_meas = re.compile(r"""
^Time:(\d{2}:\d{2}:\d{2}) # Time: 12:34:56 at beginning of line
\n{2} # Two newlines
\D+ # 1 or more non-digits
storeU=(\d+\.\d+) # Decimal-number
\s
uIx=(\d+) # Fetch uIx-variable
\s
storeI=(-?\d+.\d+) # Fetch storeI-variable
\s
iIx=(\d+) # Fetch iIx-variable
\s
avgCI=(-?\d+.\d+) # Fetch avgCI-variable
""", re.VERBOSE | re.MULTILINE)
file_times = open("output_times.txt","w")
for match in pattern_meas.finditer(text):
output = "%s,\t%s,\t\t%s,\t%s,\t\t%s,\t%s\n" % (match.group(1), match.group(2), match.group(3), match.group(4), match.group(5), match.group(6))
file_times.write(output)
file_times.close()
Peut-être il peut être écrit de plus en plus compacts et pythonic....
\r
est bon pour les retours chariot? Êtes-vous un pré-Mac OS X? Essayez \n
ou (\r?\n)
.Merci! \n semble donner un meilleur résultat.
il ya une telle chose comme
match.groups()
que vous pouvez tranche d'ignorer le premier des arguments, ou vous pouvez faire: match.group(1, 2, 3, 4, 5, 6)
.Ajouter
re.DOTALL
argument pour faire des caractères génériques correspondent à des retours à la ligneOriginalL'auteur user265978 | 2010-03-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez lire les données à partir du fichier objet en chaîne de caractères avec
ifile.read()
OriginalL'auteur Mike
Pourquoi ne pas vous lire tout le fichier en mémoire tampon à l'aide
puis faites une recherche avec qui?
Êtes-vous sûr que votre regex fonctionne, il semble assez compliqué?
La regex fonctionne... je reçois le bon de sortie dans le match.groupe
Cette solution semble donner un problème avec la fermeture du fichier.. Peut-être qu'il n'est pas important de le faire que si 🙂
OriginalL'auteur Tuomas Pelkonen
finditer
rendementMatchObjects
. Si la regex ne correspondent à rien de cetimes
sera une liste vide.Vous pouvez également modifier votre regex pour utilisation non-capture de groupes pour
storeU
,storeI
,iIx
etavgCI
, puispattern.findall
contiendra n'a d'égal fois.Note: nom de la variable
time
pourrait ombre de la bibliothèque standard du module.times
serait une meilleure option.vous avez besoin d'afficher l'exemple de votre chaîne et probablement le faire dans une autre question.
OriginalL'auteur SilentGhost