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é.
if re.match(regex, content) is not None:
blah..
Vous pouvez également utiliser re.search
en fonction de la correspondance souhaitée.
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
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")
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