Python: как использовать RegEx в выражении if?

У меня есть следующий код, который просматривает файлы в одном каталоге и копирует файлы, содержащие определенную строку, в другой каталог, но я пытаюсь использовать регулярные выражения, поскольку строка может быть как верхняя, так и нижняя или комбинация обоих.

Вот код, который работает, прежде чем я попытался использовать 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")

Вот мой код, когда я пытался использовать 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)

Я предполагаю, что мне нужна строка кода, что-то вроде

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

Но я не могу заставить работать что-либо, если кто-то может указать мне в правильном направлении, это будет оценено.

Ответ 1

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

Вы также можете использовать re.search зависимости от того, как вы хотите, чтобы он соответствовал.

Ответ 2

if re.search(r'pattern', string):

Простой if-тест:

if re.search(r'ing\b', "seeking a great perhaps"):     # any words end with ing?
    print("yes")

Проверка шаблона, извлечение подстроки, без учета регистра:

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

Заметки:

  • Используйте re.search() не re.match. Матч ограничивает начало строк, запутанное соглашение, если вы спросите меня. Если вы хотите получить совпадение, начинающееся со строки, используйте вместо него re.search(r'^...',...) вставки или \A, re.search(r'^...',...)

  • Используйте необработанный синтаксис строки r'pattern' для первого параметра. В противном случае вам потребуется удвоить обратную косую черту, как в re.search('ing\\b',...)

  • В этом примере \b - это специальная последовательность, означающая границу слова в регулярном выражении. Не путать с возвратом.

  • re.search() возвращает None если ничего не находит, что всегда ложно.

  • re.search() возвращает объект Match, если он что-то находит, что всегда верно.

  • группа - это то, что соответствует скобкам

  • нумерация групп начинается с 1

  • Спекуляции

  • Руководство

Ответ 3

REPL упрощает изучение API. Просто запустите python, создайте объект, а затем попросите о help:

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

в командной строке показано, среди прочего:

search(...)

search(string[, pos[, endpos]]) → объект соответствия или None. Просканируйте строку, ища совпадение, и верните соответствующий экземпляр MatchObject. Возврат None если никакая позиция в строке не совпадает.

так что вы можете сделать

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

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

Между прочим,

regex_txt = "facebook.com"

имеет a . который соответствует любому символу, поэтому re.compile("facebook.com").search("facebookkcom") is not None является re.compile("facebook.com").search("facebookkcom") is not None это правда, потому что . соответствует любому символу. Может быть

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

\. соответствует буквальному значению "." характер вместо лечения . как специальный оператор регулярного выражения.

Бит r"..." означает, что компилятор регулярного выражения получает escape в \. вместо интерпретатора python.

(?i) делает регулярное выражение нечувствительным к регистру, как re.IGNORECASE но самодостаточным.

Ответ 4

Regex не следует использовать таким образом - если вы не хотите что-то более сложное, чем то, что вы пытаетесь сделать - например, вы можете просто нормализовать строку контента и строку сравнения:

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

Ответ 5

Сначала вы компилируете регулярное выражение, тогда вы должны использовать его с помощью метода match, find или какого-либо другого метода, чтобы фактически запустить его против некоторого ввода.

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