LINUX.ORG.RU

Как найти строку в файле по шаблону?

 , ,


0

1

Всем доброго времени суток, есть значит у меня файл и в нем есть ссылка начинается она с https://psv4, а заканчивается на .mp3 так вот как по таким параметрам найти эту строчку в файле, помогите пожалуйста.

Всем заранее спасибо :).

Ясно, использовать регулярки, но вот я написал код для поиска строки в файле,

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re

def parse_file():
    #shab2 = 'https://cs1'
    f = open('out.txt')
    r = re.findall('https:\/\/psv4[\s\S]+?\.mp3', f)
    print(result)
    f.close()

if __name__ == '__main__':
	parse_file()
ошибка возникает,
File "test.py", line 9
    r = re.findall('https:\/\/psv4[\s\S]+?\.mp3',f)
                                                  ^
IndentationError: unindent does not match any outer indentation level
подскажите, что я не так сделал?

orionit
() автор топика
Ответ на: комментарий от orionit

print(result)

Где определяется эта переменная? Правильно, нигде. Копипастил?
Ну и про табы с пробелами уже писали.

MrClon ★★★★★
()

Извините, я не понимаю как передать вторым параметром для метода re.findall файл для поиска по шаблону, а не строку, если написать так,

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re

def parse_file():
    #shab2 = 'https://cs1'
    f = open('out.txt')
    r = re.findall('https:\/\/psv4[\s\S]+?\.mp3', f)
    print(r)
    f.close()

if __name__ == '__main__':
	parse_file()
выходит ошибка,
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    parse_file()
  File "test.py", line 9, in parse_file
    r = re.findall('https:\/\/psv4[\s\S]+?\.mp3', f)
  File "/usr/lib/python3.4/re.py", line 210, in findall
    return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
но если сделать так,
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re

def parse_file():
    #shab2 = 'https://cs1'
    f = open('out.txt')
    r = re.findall('https:\/\/psv4[\s\S]+?\.mp3', 'https://psv4.vk.me/c1662/u4653132/audios/70f9b155d966.mp3')
    print(''.join(r))
    f.close()

if __name__ == '__main__':
    parse_file()
то все работает.

orionit
() автор топика
Ответ на: комментарий от MrClon

print(result)

Где определяется эта переменная? Правильно, нигде. Копипастил?

Раньше у переменной было другое имя, заменил на более короткое, да и позабыл.

orionit
() автор топика
Ответ на: комментарий от orionit

Потому-что функция open возвращает объект класса _io.TextIOWrapper, а re.findall ищет в строках. Возможно будет работать и без этого, но явное лучше неявного, поэтому лучше явно указать что тебе нужно содержимое файла, а не объект для работы с самим файлом.

MrClon ★★★★★
()
Ответ на: комментарий от orionit

Потому что ты двоечник по питону. Засядь за учебники и не возвращайся, пока не перестанешь задавать подобные вопросы и «плавать» в трэйсбэке :-).

Virtuos86 ★★★★★
()

Всем огромнейшее спасибо за ваши ответы, но появился еще один вопрос, значит вот код целиком,

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from grab import Grab
import os, re


def parse_file():
    # shab2 = 'https://cs1'
    f = open('out.txt').read()
    r = re.findall('https:\/\/psv4[\s\S]+?\.mp3', f)
    r2 = re.findall('https:\/\/cs1[\s\S]+?\.mp3', f)
    ssilci = [''.join(r), ''.join(r2)]
    print('\n'.join(ssilci))


def main(logg, passw, ssil):
    g = Grab(log_file=u'out.txt')
    g.setup(charset = 'windows-1251')
    g.go(ssil)
    g.set_input('email', logg)
    g.set_input('pass', passw)
    g.submit()
    parse_file()

if __name__ == '__main__':
    main(input('Введите ваш логин:  '), input('Введите ваш пароль:  '), input('Введите ссылку на страницу в ВК:  '))
но при выполнении выходит ошибка,
Traceback (most recent call last):
  File "Vk-parse.py", line 27, in <module>
    main(input('Введите ваш логин:  '), input('Введите ваш пароль:  '), input('Введите ссылку на страницу в ВК:  '))
  File "Vk-parse.py", line 24, in main
    parse_file()
  File "Vk-parse.py", line 10, in parse_file
    f = open('out.txt').read()
  File "/usr/lib/python3.4/codecs.py", line 319, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 713: invalid start byte
я не пойму что он хочет, думал ругается на кодировку, попытался перекодировать в windows-1251, но ему начхать на мое перекодирование, дорогие спецы помогите пожалуйста.

orionit
() автор топика
Ответ на: комментарий от Virtuos86

Сижу за лутцом каждый день, регулярки только сегодня использовать начал и очень трудно понять в чем у темя ошибка и как правильнее ее исправить когда ты сам себе препод.

orionit
() автор топика
Ответ на: комментарий от orionit

Вангую, что out.txt в другой кодировке, а значит - нужно явно указать кодировку open-у. А как - это в доки, не вспомню навскидку.

alex4321
()

Всем огромное спасибо за ответы, все заработало.

orionit
() автор топика
Ответ на: комментарий от orionit

К премудрости книжной впредь обращаться должен ты. docs.python.org также рекомендую я.

Virtuos86 ★★★★★
()

Да и забыл проблему решил указав кодировку при открытии файла.

f = open('out.txt', encoding='cp1251').read()

orionit
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.