#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']