У меня есть список таких имен файлов,
filenames = ['122 CHC Sep 2017.xlsx', '124 CHC Sep 2017 RFK.xlsx', '124 CHC Sep 2018 Trc.xlsx']
Мне нужны первые цифры и последнее слово.
Мой вывод нуждался в этом,
['122', '124 RFK', '124 Trc']
Я пробовал следующее,
regex = re.compile(r'^\D*(\d+)([a-zA-Z]+)\.[a-zA-Z]+$')
[regex.findall(x) for x in filenames]
я получаю
[['122'],['124'], ['124']]
Я пробовал это,
regex = re.compile(r'^\D*(\d+).*?([a-zA-Z]+)\.[a-zA-Z]+$')
[regex.findall(x) for x in filenames]
Я получаю,
[[], ['124', 'RFK'], ['124', 'Trc']]
На этот раз я не получаю 122
.
Как я могу изменить свой код? Любые предложения были бы замечательными!
(Примечание: если есть способ использовать все алфавиты с большой буквы, а затем выполнить регулярное выражение, это было бы здорово)
@ WiktorStribiżew Красиво! Это сработало, хотя оно возвращается как кортеж. Не могли бы вы опубликовать его в качестве ответа с некоторыми пояснениями. Мне очень хотелось бы знать, что творится под капотом. Я слежу за документами python, не очень помогло :(
знаете ли вы о regex101.com, переключитесь в режим Python, вставьте демонстрационный текст и шаблон (без r 'и') и прочтите текстовое объяснение на сайте?
@PatrickArtner Круто, похоже, хороший ресурс. Раньше не пользовался. Я обязательно его изучу!
Вы можете использовать
^\D*(\d+)(?:.*?(\s*[a-zA-Z]+)|.*)\.[a-zA-Z]+$
См. демонстрация регулярного выражения.
Подробности
^
- начало строки\D*
- 0+ нецифров(\d+)
- Группа 1: одна или несколько цифр(?:.*?(\s*[a-zA-Z]+)|.*)
- любая из двух альтернатив:
.*?(\s*[a-zA-Z]+)
- любые символы 0+, как можно меньше, за которыми следует Группа 1, захватывающая 0+ пробелов и 1+ букв|
- или.*
- любые символы 0+, как можно больше\.
- точка
-[a-zA-Z]+
- 1+ буквы$
- конец строки.Ниже Демо Python:
import re
filenames = ['122 CHC Sep 2017.xlsx', '124 CHC Sep 2017 RFK.xlsx', '124 CHC Sep 2018 Trc.xlsx']
rx = re.compile(r'^\D*(\d+)(?:.*?(\s*[a-zA-Z]+)|.*)\.[a-zA-Z]+$')
print([rx.sub(r'\1\2', x) for x in filenames])
# => ['122', '124 RFK', '124 Trc']
Идеально! Очень признателен! Надо любить python
все больше и больше!
Попробуйте
re.sub(r'^\D*(\d+)(?:.*?(\s*[a-zA-Z]+)|.*)\.[a-zA-Z]+$', r'\1\2', x)