Извлечение части строки из другой строки с помощью регулярного выражения

#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:

Я ЛЮБЛЮ регулярные выражения, так что это определенно тот путь, которым я бы пошел.

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

  1. одна или несколько цифр, затем
  2. один символ подчеркивания, затем
  3. группа символов, не содержащих ‘.’, затем
  4. a ‘.’, затем
  5. что угодно, кроме ‘.’, но хотя бы один символ

Часть # 3 захвачена.

 import re

s = '23092020_indent.xlsx'

exp = re.compile(r"^d _(.*?).[^.] $")
m = exp.match(s)
if m:
    print(m.group(1))
  

Результат:

 indent