Предположим, у нас могут быть входящие строки в следующих формах:

st = 'Skank Up [feat. Ding Dong] (Oh Lawd)'
st2 = 'Skank Up (Oh Lawd) [feat. Ding Dong]'
st3 = 'Skank Up (Oh Lawd) (feat. Ding Dong)'

Во всех трех случаях я хочу получить:

'Skank Up (Oh Lawd)'

Как это можно сделать с помощью регулярного выражения?

Дальше я пришел:

st = re.match('.*(?:\(feat|\[feat)', st)

Но это возвращает:

<_sre.SRE_Match object; span=(0, 14), match='Skank Up [feat'>
1
zerohedge 20 Сен 2018 в 02:11

2 ответа

Лучший ответ

Вы можете убрать скобки, начинающиеся с feat, используя re.sub как

re.sub(r'\s*(?:\[feat[^][]+]|\(feat[^()]+\))', '', st)

См. демонстрацию регулярного выражения

< Сильный > Подробнее

  • \s* - 0+ пробелов
  • (?:\[feat[^][]+]|\(feat[^()]+\)) - группа без захвата, соответствующая двум альтернативам: < UL>
  • \[feat[^][]+] - [, затем feat, затем 1+ символов, кроме ] и [, а затем ]
  • | - или
  • \(feat[^()]+\) - (, затем feat, затем 1+ символов, кроме ( и ), а затем ).

Вы также можете использовать небольшое изменение, если в скобках нет ничего, кроме feat:

re.sub(r'\s*(?:\[feat[^]]*]|\(feat[^)]*\))', '', st)

Демонстрация Python:

import re
sts = ['Skank Up [feat. Ding Dong] (Oh Lawd)','Skank Up (Oh Lawd) [feat. Ding Dong]', 'Skank Up (Oh Lawd) (feat. Ding Dong)']
for st in sts:
    print(re.sub(r'\s*(?:\[feat[^][]+]|\(feat[^()]+\))', '', st))

Выход:

Skank Up (Oh Lawd)
Skank Up (Oh Lawd)
Skank Up (Oh Lawd)
1
Wiktor Stribiżew 19 Сен 2018 в 23:23

Я бы решил эту проблему с помощью однострочного sub команда:

re.sub(r" \[feat[^\]]*\]", "", st)

Что преобразует ваш ввод следующим образом:

Skank Up [feat. Ding Dong] (Oh Lawd)  
Skank Up (Oh Lawd)

Вы можете изменить его, чтобы принимать и другие типы скобок, такие как ( и [:

re.sub(r" [\[\(]feat[^\])]*[)\]]", "", st)
0
Addison 19 Сен 2018 в 23:34