#python
#python
Вопрос:
Предположим, у меня есть строка следующим образом:
s = '23092020_indent.xlsx'
Я хочу извлечь только indent
из приведенной выше строки. Теперь существует много подходов:
#Via re.split() operation
s_f = re.split('_ |. ',s) <---This is returning 's' ONLY. Not the desired output
#Via re.findall() operation
s_f = re.findall(r'[^A-Za-z]',s,re.I)
s_f
['i','n','d','e','n','t','x','l','s','x']
s_f = ''.join(s_f) <----This is returning 'indentxlsx'. Not the desired output
Я что-то упускаю? Или мне regex
вообще нужно использовать?
PS Во всей части s
только разделитель ‘.’ будет постоянным. Остальные все разделители могут быть изменены.
Ответ №1:
Используйте os.path.splitext
и затем str.split
:
import os
name, ext = os.path.splitext(s)
name.split("_")[1] # If the position is always fixed
Вывод:
"indent"
Комментарии:
1. Вместо [:-1] должно быть [1], не так ли?
2. @pythondumb Не совсем. В случае, если нечего разделить,
name.split("_")[1]
может привестиIndexError
к, тогдаname.split("_")[-1]
как вернется к тому, чтоname
было. Попробуйте использовать пример, подобный23092020.xlsx
.3.
indent
ключевое слово. следовательно, это было бы там наверняка. Кроме того, если у меня есть несколько разделителей, то метода, который вы показали, будет недостаточно. Например.23092020_indent_archive.pdf
4. @pythondumb Да, это не сработает, как и регулярное выражение. Если вы всегда уверены в позиции
"indent"
, индексация — лучший способ ;). Я отредактировал соответствующим образом.
Ответ №2:
Я ЛЮБЛЮ регулярные выражения, так что это определенно тот путь, которым я бы пошел.
Для точного правильного ответа требуется больше информации обо всех возможных входных строках и о том, что нужно извлечь для каждой из них. Вот решение, которое предполагает:
- одна или несколько цифр, затем
- один символ подчеркивания, затем
- группа символов, не содержащих ‘.’, затем
- a ‘.’, затем
- что угодно, кроме ‘.’, но хотя бы один символ
Часть # 3 захвачена.
import re
s = '23092020_indent.xlsx'
exp = re.compile(r"^d _(.*?).[^.] $")
m = exp.match(s)
if m:
print(m.group(1))
Результат:
indent