2014-07-06 2 views
0

J'ai un fichier avec des lignes de cette forme:Regex chaîne de capture Python guillemets

ClientsName(0) = "SUPERBRAND": ClientsName(1) = "GREATSTUFF": cClientsNames.Add Key:="SUPER", Item:=ClientsName

et je voudrais saisir les noms entre guillemets "" après ClientsName(0) = et ClientsName(1) =.

Jusqu'à présent, je suis venu avec ce code

import re 

f = open('corrected_clients_data.txt', 'r') 
result = '' 
re_name = "ClientsName\(0\) = (.*)" 
for line in f: 
    name = re.search(line, re_name) 
    print (name) 

qui revient None à chaque ligne ...

Deux sources d'erreur peuvent être: les barres obliques inverses et la séquence de capture (.*) .. .

Répondre

2

Vous pouvez le faire en utilisant plus facilement re.findall et en utilisant \d au lieu de 0 faire plus générale:

import re 

s = '''ClientsName(0) = "SUPERBRAND": ClientsName(1) = "GREATSTUFF": cClientsNames.Add Key:="SUPER", Item:=ClientsName''' 

>>> print re.findall(r'ClientsName\(\d\) = "([^"]*)"', s) 
['SUPERBRAND', 'GREATSTUFF'] 

Une autre chose que vous devez noter est que votre commande d'arguments pour search() ou findall() est faux. Il devrait être le suivant: re.search(pattern, string)

0

Utilisez un regard en arrière pour obtenir la valeur de ClientsName(0) et ClientsName(1) par re.findall fonction,

>>> import re 
>>> str = '''ClientsName(0) = "SUPERBRAND": ClientsName(1) = "GREATSTUFF": cClientsNames.Add Key:="SUPER", Item:=ClientsName''' 
>>> m = re.findall(r'(?<=ClientsName\(0\) = \")[^"]*|(?<=ClientsName\(1\) = \")[^"]*', str) 
>>> m 
['SUPERBRAND', 'GREATSTUFF'] 

Explication:

  • (?<=ClientsName\(0\) = \") lookbehind positif est utilisé pour définir le marqueur correspondant juste après à la chaîne ClientsName(0) = "
  • [^"]* Ensuite, il correspond à un caractère non de " zéro fois ou plus. Donc, il correspond à la première valeur, c'est-à-dire SUPERBRAND
  • | Opérateur OR logique utilisé pour combiner deux regex.
  • (?<=ClientsName\(1\) = \")[^"]* Correspond à tout caractère juste après la chaîne ClientsName(1) = " jusqu'à la " suivante. Maintenant, il correspond à la deuxième valeur c.-à-GREATSTUFF
0

Vous pouvez utiliser re.findall et juste prendre les deux premiers matches:

>>> s = '''ClientsName(0) = "SUPERBRAND": ClientsName(1) = "GREATSTUFF": cClientsNames.Add Key:="SUPER", Item:=ClientsName''' 
>>> re.findall(r'\"([^"]+)\"' , s)[:2] 
['SUPERBRAND', 'GREATSTUFF'] 
0

essayer cette

import re 

text_file = open("corrected_clients_data.txt", "r") 
text = text_file.read() 
matches=re.findall(r'\"(.+?)\"',text) 

text_file.close() 

si vous remarquez le point d'interrogation indique que nous devons arrêter de lire la chaîne lors de la première fin des guillemets doubles rencontrées (?).

espérons que cela vous sera utile.

Questions connexes