2016-09-17 3 views
1

Я пытаюсь выполнить проект «Поиск по регулярному выражению» из книги Automate boring stuff with python. Я попытался найти ответ, но мне не удалось найти связанный поток в python.Поиск нескольких строк с регулярным выражением?

Задача: «Создать программу, которая открывает все .txt-файлы в папке и ищет любую строку, соответствующую пользовательскому регулярному выражению. Результаты должны быть напечатаны на экране».

С ниже компиляцией мне удалось найти первый матч

regex = re.compile(r".*(%s).*" % search_str) 

И я могу распечатать его с

print(regex.search(content).group()) 

Но если я пытаюсь использовать

print(regex.findall(content)) 

вывод - это только введенное слово/слова, а не вся строка, в которой они находятся. Почему не будет findall соответствовать всей строке, даже если это то, как я скомпилировал регулярное выражение?

Мой код выглядит следующим образом.

# Regex search - Find user given text from a .txt file 
# and prints the line it is on 

import re 

# user input 
print("\nThis program searches for lines with your string in them\n") 
search_str = input("Please write the string you are searching for: \n") 
print("") 
# file input 
file = open("https://stackoverflow.com/users/viliheikkila/documents/kooditreeni/input_file.txt") 
content = file.read() 
file.close() 

# create regex 
regex = re.compile(r".*(%s).*" % search_str) 

# print out the lines with match 
if regex.search(content) is None: 
    print("No matches was found.") 
else: 
    print(regex.findall(content)) 
+0

P.S. Я новичок в программировании и stackoverflow, поэтому вся помощь приветствуется. Также, если я нарушу правила поведения, пожалуйста, дайте мне знать, так что я буду знать лучше в следующий раз. Благодаря! – ananaa

+0

Добро пожаловать в сообщество StackOverflow. Вам вообще не нужно группировать '. *% S. *' – revo

+0

Спасибо, друг! Это был не первый случай, когда ненужные скобки разрушали мой код. – ananaa

ответ

0

В Python регулярное выражение, круглые скобки определяют захвата группы. (См. here для разбивки и объяснения).

findall вернет только захваченную группу. Если вам нужна вся строка, вам придется перебирать результат finditer.

+0

Спасибо! Это было очень полезно. Я получил свой код на самом деле, выполнив удаление скобок. И спасибо за отличную ссылку. – ananaa

Смежные вопросы