Почему re.findall () не переходит к следующей строке текстового файла для поиска букв?

#python #regex #findall

#python #регулярное выражение #findall

Вопрос:

Почему re.findall возвращает алфавиты вместо слов?

 Tint = open('poem.txt')
text1 = Tint.read()
output = []
for line in text1:
    line = line.rstrip()
    if re.findall(r'bTwinkleb.*?blittleb', text1):
        output.append(line)
  

В настоящее время мой ожидаемый результат — Twinkle Twinkle little но то, что я получаю с помощью этого кода, T , w ,…

Я также хочу, чтобы код мог выполнять поиск в следующей строке. Например: если я говорю, re.findall(r'bTwinkleb.*?wonderb', text1) это должно выдавать Twinkle Twinkle little star How I wonder . Как я могу это сделать? for line in text1 не помогает.

PS: poem.txt содержит 4 строки стихотворения Twinkle twinkle little star

Ответ №1:

Ошибка 1: text1 является объектом string, тогда указание for line in text1 означает, что line это будет символ.

Ошибка 2: Вы каждый раз выполняете поиск во всем текстовом файле text1 , а не в отдельной строке.

Я думаю, вы хотите что-то вроде этого:

 Tint=open('poem.txt')
text1=Tint.readlines()
output=[]
for line in text1:
    if re.findall(r'bTwinkleb.*?blittleb', line.rstrip()) :
        output.append(line)
  

Обратите внимание на использование readlines() функции, так что text1 это будет не строка, а массив строк.

Комментарии:

1. Спасибо, это помогло в получении слов в качестве выходных данных вместо алфавита. Теперь результат, который я получаю, — «Мерцающая звездочка». Но я хочу выводить как «Twinkle, Twinkle little». Кроме того, мне нужно, чтобы, если я сделаю это «re.findall(r’ bTwinkle b.*? bwonder b’, line.rstrip()), он мог выдавать мне «Мерцающую звездочку, как мне интересно» PS: poem.txt содержит что-то вроде этого: Мерцай, мерцай, маленькая звездочка, Как мне интересно, кто ты, Так высоко над миром, Обратите внимание: «wonder» в новой строке

Ответ №2:

Я предлагаю взглянуть на документацию re.findall .

Ответом на вашу конкретную проблему является re.findall(r'bTwinkleb.*?blittleb', text1,re.DOTALL) или re.findall(r'bTwinkleb.*?blittleb', text1,re.MULTILINE) .