Строка Python для списка?

#python #regex

Вопрос:

Я пытаюсь преобразовать строку в список

  str = "ab(1234)bcta(45am)in23i(ab78lk)"
 

Ожидаемый Результат

  res_str = ["ab","bcta","in23i"]
 

Я попытался снять скобки с str.

  re.sub(r'([^)]*)', '', str)
 

Ответ №1:

Вы можете использовать отрицательный класс символов с заголовком:

 >>> s = "ab(1234)bcta(45am)in23i(ab78lk)"
>>> print (re.findall(r'[^()] (?=()', s))
['ab', 'bcta', 'in23i']
 

Сведения о регулярном выражении:

  • [^()] : Сопоставьте 1 или более любого персонажа, которого нет ( , и )
  • (?=() : Взгляд вперед, чтобы утверждать, что впереди есть (

Ответ №2:

Здесь так много вариантов. Одной из возможностей было бы использование split :

 import re
str = "ab(1234)bcta(45am)in23i(ab78lk)"
print(re.split(r'(.*?)', str)[:-1])
 

ВОЗВРАТ:

 ['ab', 'bcta', 'in23i']
 

Вторым вариантом было бы разделить все парантезы и разрезать полученный массив:

 import re
str = "ab(1234)bcta(45am)in23i(ab78lk)"
print(re.split('[()]', str)[0:-1:2])
 

Где [0:-1:2] означает начинать с индекса 0, останавливаться на предпоследнем индексе и делать два шага по индексам.

Ответ №3:

Используйте re.split

 import re

str = "ab(1234)bcta(45am)in23i(ab78lk)"

print(re.split('(.*?)', str))
 

ВОЗВРАТ:

 ['ab', 'bcta', 'in23i', '']
 

Если вы хотите избавиться от пустых строк в своем списке, вы можете использовать фильтр:

 print(list(filter(None, re.split('(.*?)', str))))
 

ВОЗВРАТ:

 ['ab', 'bcta', 'in23i']
 

Ответ №4:

Вы можете сопоставить все буквенно-цифровые символы, за которыми следует ( :

 >>> re.findall('w (?=()',str)
['ab', 'bcta', 'in23i']
 

или использовать re.sub так, как вы это делали:

 >>> re.sub('([^)] )',' ',str).split()
['ab', 'bcta', 'in23i']
 

Ответ №5:

Просто ради сложности :

 >>>> str = "ab(1234)bcta(45am)in23i(ab78lk)"
>>>> res_str = [y[-1] for y in [ x.split(')') for x in str.split('(')]][0:-1]
['ab', 'bcta', 'in23i']