Помощь в python regex

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Всем привет. Прохожу обучение сейчас по питону и не могу о конца решить пару задач. Было бы очень здорово если бы мне помогли и объяснили почему и как. Ибо "преподы" не объясняют, а только проверяют задания.

В этом задании нужно с помощью регулярок вывести только названия расширений граф.файлов таких как jpeg png и т.д
Я то все сделал, оно выводит. Но если дописать к примеру pngg в расширение,то оно так и выдаст, а нужно что бы выводило все четко.

Python:
import re

text = '''Примеры расширений файлов:
wald.jpeg
wow.mp4
book.txt
forest.png
fox.tiff
wood.pdf
hub.gif
small.zip
sound.mp3
'''

pattern = r'[\w]+\.[jpengtif]{3,}'
res = re.findall(pattern, text)
print('\n'.join(res))



И вот второе задание, тоже на регулярках, есть файлик с именами, нужно из него вывести все фамилии женского рода в один файл, мужского в другой

Python:
import re

with open('surenames.txt', encoding='utf - 8') as file:
    surnames = file.read()
    man = re.findall(r'\w+[оевинй]{2,}$', surnames, re.I + re.M)
    woman = re.findall(r'\w+[вная]{2,}$', surnames, re.I + re.M)
    with open('woman.txt', 'w', encoding='utf - 8') as woman_f:
        with open('man.txt', 'w', encoding='utf - 8') as man_f:
            woman_f.write('\n'.join(woman).title())
            man_f.write('\n'.join(man).title())
            print('Done!')
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот как задание звучит
Вот пример:
Python:
import re


with open('surname.txt', 'r', encoding='utf-8') as f, \
    open('man.txt', 'w', encoding='utf-8') as f2, \
    open('woman.txt', 'w', encoding='utf-8') as f3:
        for s in f:
            s = '-'.join([x.capitalize() for x in s.split('-')])
            if bool(re.search(r'\w\S+(?:ва|на|ая)\b', s)):
                f3.write(s)
            else:
                f2.write(s)
print('Done!')
или с использованием str.title():
Python:
import re


with open('surname.txt', 'r', encoding='utf-8') as f, \
    open('man.txt', 'w', encoding='utf-8') as f2, \
    open('woman.txt', 'w', encoding='utf-8') as f3:
        for s in f:
            if bool(re.search(r'\w\S+(?:ва|на|ая)\b', s.title())):
                f3.write(s.title())
            else:
                f2.write(s.title())
print('Done!')
 
Последнее редактирование:
  • Мне нравится
Реакции: hellhyde

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример для первого задания:
Python:
import re


text = '''Примеры расширений файлов:
wald.jpeg
wow.mp4
book.txt
forest.png
fox.tiff
wood.pdf
hub.gif
small.zip
sound.mp3
'''

pattern = r'[\w]+\.(?:jpeg|png|tiff|gif)\b'
res = re.findall(pattern, text)
print('\n'.join(res))
 
  • Мне нравится
Реакции: hellhyde

Jerry

Пользователь
Пользователь
Июл 28, 2020
29
12
3
surnames.txt:
Код:
Иванова
Петров
Матвеева
Ковалев

look_for_women.py:
Python:
import re

DATA_FILE = 'surnames.txt'

with open(DATA_FILE, encoding='utf-8') as source_file:
    surnames = source_file.read()
    ENDINGS = '|'.join([
        'ова',
        'ева'
    ])

    pattern = fr'\w+(?:{ENDINGS})\b'
    women = re.findall(pattern, surnames)

    print(women)

output:
Bash:
['Иванова', 'Матвеева']

* pattern = fr'\w+(?:{ENDINGS})\b'
не будет понимать конструкцию регулярных выражений {}, поскольку f-строки подставляют результат исполнения кода в этих скобках.
Подробнее

Вариант без интерполяции:
pattern = r'\w+(?:ова|ева)\b'
и удалить константу ENDINGS
 
  • Мне нравится
Реакции: hellhyde

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Вот пример для первого задания:

А не подскажите за второе. Там нужно что бы строго разделялись типа НА АЯ ВА к примеру. Думаю все в паттерне дело.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
А не подскажите за второе. Там нужно что бы строго разделялись типа НА АЯ ВА к примеру. Думаю все в паттерне дело.
Пример файла с фамилиями покажите.
 

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Пример файла с фамилиями покажите.
АБ
АБ-ГАНЕЕВ
АБ-ГАНЕЕВА
АБАБАКИРОВА
АБАБИЛОВ
АБАБИЛОВА
АБАБКОВ
АБАБКОВА
АБАГАЕВА
АБАГАН
АБАГОВА
АБАГЯН
АБАДАЕВ
АБАДАЕВА
АБАДАШЕВ
АБАДЕЕВА
АБАДЕНКОВ
АБАДЖАН
АБАДЖЕВ
АБАДЖЕВА
АБАДЖИДИ
АБАДЖЯН
АБАДЗИДЕ
АБАДУЛИНА
АБАЕВ
АБАЕВА
АБАЖАЕВ
АБАЖАЕВА
АБАЗАВА
АБАЗАДЗЕ
АБАЗАРЛИ
АБАЗИН
АБАЗИНА
АБАЗОВ
АБАЗОВА
АБАЗОВСКАЯ
АБАЗЬЕВА
АБАЗЯН
АБАИМОВ
АБАИМОВА
АБАЙДУЛИН
АБАЙДУЛИНА
АБАЙДУЛЛИН


Это лишь маленькая часть.
Нужно что бы мужиков в один файл писало, а женщин в другой
 

hellhyde

Новичок
Пользователь
Июл 28, 2020
28
4
3
Пример файла с фамилиями покажите.

Вот как задание звучит
Прочитайте файл surname.txtи все фамилии явно женского рода, оканчивающиемя на ВА, НА, АЯзапишите в файл woman.txt, а оставшиеся в другой файл man.txtЗаодно при записи приведите фамилии к виду: Первая буква заглавная, а остальные строчные.Если в фамилии встречается дефис, то после дефиса первая буква тоже должна быть заглавной. Пример: Башкатова-ТрубниковаПо окончанию записи вывести в консоль Done!
 

Форум IT Специалистов