2013-01-08 16 views
24

Ho il seguente codice che esamina i file in una directory e copia i file che contengono una determinata stringa in un'altra directory, ma sto cercando di utilizzare le espressioni regolari in quanto la stringa potrebbe essere maiuscola e minuscola o un mix di entrambi.Python: Come usare RegEx in un'istruzione if?

Ecco il codice che funziona, prima ho cercato di usare di RegEx

import os 
import re 
import shutil 

def test(): 
    os.chdir("C:/Users/David/Desktop/Test/MyFiles") 
    files = os.listdir(".") 
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2") 
    for x in (files): 
     inputFile = open((x), "r") 
     content = inputFile.read() 
     inputFile.close() 
     if ("Hello World" in content) 
      shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2") 

Ecco il mio codice, quando ho cercato di usare di RegEx

import os 
import re 
import shutil 

def test2(): 
    os.chdir("C:/Users/David/Desktop/Test/MyFiles") 
    files = os.listdir(".") 
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2") 
    regex_txt = "facebook.com" 
    for x in (files): 
     inputFile = open((x), "r") 
     content = inputFile.read() 
     inputFile.close() 
     regex = re.compile(regex_txt, re.IGNORECASE) 

Im indovinando che ho bisogno di una linea di codice che è qualcosa di simile

if regex = re.compile(regex_txt, re.IGNORECASE) == True 

Ma I cant sembrano avere qualcosa da lavoro, se qualcuno potesse indicami la giusta direzione, sarebbe apprezzato.

+0

Per riferimento futuro, si potrebbe trovare questo utile: [Regular Expression HOWTO] (http://docs.python.org/2/howto/regex.html) per Python 2.7. – detly

risposta

49
if re.match(regex, content) is not None: 
    blah.. 

Si potrebbe anche usare re.search a seconda di come si vuole essere trovato.

+0

grazie, supponendo dalla tua risposta che se la regex non corrispondesse a qualcosa, restituirebbe "Nessuno" –

+0

Giusto. Controlla http://docs.python.org/2/library/re.html#re.search per vedere la differenza tra l'uso della funzione search() vs match(). – aw4lly

+4

LWH91 @ se si voleva '.match()' quindi il codice originariamente avrebbe dovuto essere utilizzando '.startswith()' e non 'tale dicitura :) –

0

Prima di compilare la regex, quindi devi usarlo con match, find, o qualche altro metodo per eseguirlo effettivamente contro qualche input.

import os 
import re 
import shutil 

def test(): 
    os.chdir("C:/Users/David/Desktop/Test/MyFiles") 
    files = os.listdir(".") 
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2") 
    pattern = re.compile(regex_txt, re.IGNORECASE) 
    for x in (files): 
     with open((x), 'r') as input_file: 
      for line in input_file: 
       if pattern.search(line): 
        shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2") 
        break 
7

REPL semplifica l'apprendimento delle API. Basta eseguire python, creare un oggetto e poi chiedere help:

$ python 
>>> import re 
>>> help(re.compile(r'')) 

alle esposizioni della riga di comando, tra le altre cose:

search(...)

search(string[, pos[, endpos]]) -> oggetto fiammifero o None. Analizza la stringa cercando una corrispondenza e restituisce un'istanza MatchObject corrispondente. Restituire None se nessuna posizione nella stringa corrisponde.

in modo da poter fare

regex = re.compile(regex_txt, re.IGNORECASE) 

match = regex.search(content) # From your file reading code. 
if match is not None: 
    # use match 

Per inciso,

regex_txt = "facebook.com" 

ha un . che corrisponde a qualsiasi carattere, in modo re.compile("facebook.com").search("facebookkcom") is not None è vero perché . corrisponde a qualsiasi carattere. Forse

regex_txt = r"(?i)facebook\.com" 

Il \. corrisponde a un letterale "." carattere invece di trattare . come una speciale operatore di espressione regolare.

Il r"..." bit significa che il compilatore di espressioni regolari ottiene l'escape in \. anziché il parser python che lo interpreta.

Il (?i) rende la regex senza distinzione tra maiuscole e minuscole come re.IGNORECASE ma autonomo.

1

Regex di non realtà dovrebbe essere utilizzato in questo modo - a meno che non si desidera qualcosa di più complicato di quello che stai cercando di fare - per esempio, si può solo normalizzare la stringa di contenuto e la stringa di confronto per essere:

if 'facebook.com' in content.lower(): 
    shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2") 
2

if re.(ho sempre inciampare qui)

if re.search(r'pattern', string):(io di solito finiscono come questo)

Un test se-semplice:

if re.search(r'ing\b', "seeking and blundering"): 
    print("yes") 

Verificare la presenza di un modello, estrarre una sottostringa, case insensitive:

match_object = re.search(r'$OUGHT (.*) BE^', "ought to be", flags=re.IGNORECASE) 
if match_object: 
    assert "to" == match_object.group(1) 

Note:

  • Usa re.search() non re.match. Corrispondenza restricts to the start di archi, una convenzione confusa incline se me lo chiedi. Anche se si desidera che, usare dollaro invece, re.search(r'$...', ...)

  • Usa raw string sintassi r'pattern' per il primo parametro. In caso contrario, si avrebbe bisogno di raddoppiare backslash, come in re.search('ing\\b', ...)

  • In questo esempio, è un \bspecial sequence significa word-boundary in regex. Da non confondere con backspace.

  • re.search() restituisce None se non trova nulla, che è sempre falsy.

  • re.search() restituisce un Match object se trova qualcosa, che è sempre vero.

  • un gruppo è quello che ha trovato all'interno delle parentesi

  • numerazione gruppo inizia a 1

  • Specs

  • Tutorial