web-dev-qa-db-fra.com

Python - Comment utiliser regexp sur un fichier, ligne par ligne, en Python

J'ai essayé d'utiliser un titre différent pour la question, mais si vous pouvez améliorer la question, veuillez le faire. 

Voici mon regexp: f\(\s*([^,]+)\s*,\s*([^,]+)\s*\) 

Je devrais l'appliquer sur un fichier, ligne par ligne. La ligne par ligne est OK, la lecture simple à partir d'un fichier et une boucle. Mais comment appliquer l'expression rationnelle aux lignes? 

Merci pour toute l'aide, et désolé pour la question noob.

12
Shiki

L'expression suivante renvoie une liste. chaque entrée de cette liste contient toutes les correspondances de votre expression rationnelle dans la ligne respective.

>>> import re
>>> [re.findall(r'f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)',line) 
            for line in open('file.txt')]
16
phynfo

Vous pouvez essayer quelque chose comme ça: 

import re
regex = re.compile("f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)")
with open("my_file.txt") as f:
    for line in f:
        result = regex.search(line)
8
Cédric Julien
import re
with open('file.txt') as f:
    for line in f:
        match = re.search('f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)', line)

Notez que Python compile et met automatiquement la regex en mémoire cache. Par conséquent, une étape de compilation distincte n'est pas requise dans ce cas.

7
Mike Pennington

Une autre façon de faire

import re
[line for line in open('file.txt') if re.match(r'f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)',line)]
3
Seb Alex

utilisez import re, puis re.compile() avec votre modèle comme argument et utilisez l'attribut match de l'objet résultant sur chaque ligne. quelque chose comme ça.. 

import re 
pat = re.compile(r'f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)')
for line in file:
  # use pat.match, pat.search .. etc
1
wim

J'ai utilisé cette approche:

import re
#Define the search term:
pattern = f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)

#Create an empty list:
data = []

#then

for line in open(r'file.txt'):
    if line !='':  #<-- To make sure the whole file is read
        Word = re.findall(pattFinder1, line)
        data.append(str(Word))   
0
for line in file:
   line = re
           .match("f\(\s*([^,]+)\s*,\s*([^,]+)\s*\)",line)
           .group(0)
0
Shihui Hu