Ответ 1
if re.match(regex, content) is not None:
blah..
Вы также можете использовать re.search
зависимости от того, как вы хотите, чтобы он соответствовал.
У меня есть следующий код, который просматривает файлы в одном каталоге и копирует файлы, содержащие определенную строку, в другой каталог, но я пытаюсь использовать регулярные выражения, поскольку строка может быть как верхняя, так и нижняя или комбинация обоих.
Вот код, который работает, прежде чем я попытался использовать 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
Но я не могу заставить работать что-либо, если кто-то может указать мне в правильном направлении, это будет оценено.
if re.match(regex, content) is not None:
blah..
Вы также можете использовать re.search
зависимости от того, как вы хотите, чтобы он соответствовал.
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
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
но самодостаточным.
Regex не следует использовать таким образом - если вы не хотите что-то более сложное, чем то, что вы пытаетесь сделать - например, вы можете просто нормализовать строку контента и строку сравнения:
if 'facebook.com' in content.lower():
shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2")
Сначала вы компилируете регулярное выражение, тогда вы должны использовать его с помощью метода 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