web-dev-qa-db-fra.com

Python: Comment utiliser RegEx dans une instruction if?

J'ai le code suivant qui parcourt les fichiers d'un répertoire et copie les fichiers contenant une chaîne dans un autre répertoire, mais j'essaie d'utiliser des expressions régulières, car la chaîne peut être en majuscule ou en minuscule. 

Voici le code qui fonctionne, avant d'essayer d'utiliser 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")

Voici mon code quand j'ai essayé d'utiliser 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)

Je devine que j'ai besoin d'une ligne de code qui ressemble à quelque chose comme

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

Mais je n'arrive pas à obtenir quoi que ce soit au travail, si quelqu'un pouvait me diriger dans la bonne direction, ce serait apprécié. 

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

Vous pouvez également utiliser re.search en fonction de la correspondance souhaitée.

69
aw4lly

if re.(je trébuche toujours ici)

if re.search(r'pattern', string):(je finis généralement comme ça)

Un simple test si:

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

Recherchez un motif, extrayez une sous-chaîne, insensible à la casse:

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

Remarques:

  • Utilisez re.search() not re.match. Associez restreint au début } des chaînes, une convention { déroutante } si vous me le demandez. Si vous voulez une correspondance de début de chaîne, utilisez caret ou \A à la place, re.search(r'^...', ...)

  • Utilisez chaîne brute syntaxe r'pattern' pour le premier paramètre. Sinon, vous devrez doubler les barres obliques inverses, comme dans re.search('ing\\b', ...) 

  • Dans cet exemple, \b est un séquence spéciale signifiant limite de mot dans une expression régulière. Ne pas confondre avec backspace.

  • re.search() renvoie None s'il ne trouve rien, qui est toujours falsy

  • re.search() renvoie un objet Match s'il trouve quoi que ce soit, ce qui est toujours la vérité.

  • un groupe correspond aux parenthèses 

  • la numérotation des groupes commence à 1

  • Specs

  • Didacticiel

7
Bob Stein

Les regex ne devraient pas vraiment être utilisés de cette façon - à moins que vous ne vouliez quelque chose de plus compliqué que ce que vous essayez de faire - par exemple, vous pourriez simplement normaliser votre chaîne de contenu et votre chaîne de comparaison comme suit:

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

Tout d’abord, vous compilez l’expression rationnelle, puis vous devez l’utiliser avec match, find ou une autre méthode pour l’exécuter avec certaines entrées.

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
0
Silas Ray