эффективный способ получить строку между двумя словами

#arrays #python-3.x #string #list

Вопрос:

У меня есть список строк, как:

 strings= ['stackasdf:5;iwantthis123jasdoverflow','iwantthistoo','asdf:5;python123jasd']
 

Теперь я хочу напечатать строки как между двумя подстроками (start=asdf:5; end=123jasd) , так и между ними.

ожидаемый результат:

 iwantthis
iwantthistoo
python
 

То, что я сделал, это:

 import re
start = 'asdf:5;'
end = '123jasd'
for i in strings:
    t=i[len(start):-len(end)]
    if t:
        print (t)
    else:
        print (i)

df:5;iwantthis123jasdo 
iwantthistoo 
python
 

Я не получаю желаемого результата, как ожидалось.

Комментарии:

1. Я голосую за то, чтобы закрыть этот вопрос, потому что неясно, о чем просит ОП, основываясь на комментариях в ответах.

Ответ №1:

Используя подход регулярных выражений, мы можем попробовать:

 strings = ['stackasdf:5;iwantthis123jasdoverflow','iwantthistoo','asdf:5;python123jasd']
output = [re.findall(r'asdf:5;(.*?)123jasd', x)[0] if re.search(r'asdf:5(.*?)123jasd', x) else x for x in strings]
print(output)  # ['iwantthis', 'iwantthistoo', 'python']
 

Комментарии:

1. Спасибо, Тим. Но мне не нужен список строк, так как я хочу добавить его в другой массив.

2. Я дал правильный и эффективный ответ, основанный на вопросе, который вы задали выше.

Ответ №2:

Вы можете просто использовать оператор simple для каждого цикла и if, чтобы распечатать правильную подстроку каждого элемента в массиве:

 strings=  ['stackasdf:5;iwantthis123jasdoverflow','iwantthistoo','asdf:5;python123jasd']

for word in strings:
    if "asdf:5;" in word and "123jasd" in word:
      ind1 = word.index("asdf:5;")
      ind2 = word.index("123jasd")
      print(word[ind1 7:ind2])
    else:
      print(word)
 

выход:

 iwantthis
iwantthistoo
python
 

Комментарии:

1. Я ищу более эффективный способ сделать это, так как у меня есть список из тысяч строк.

Ответ №3:

Используйте функцию замены и разделения?

 strings = ['stackasdf:5;iwantthis123jasdoverflow',
           'iwantthistoo',
           'asdf:5;python123jasd']
for i in strings:
    c = 'n'  # c may be any character that is not present in your strings
    i = i.replace('asdf:5;', c).replace('123jasd', c).split(c)
    print(i[0] if len(i) == 1 else i[1])
print(f'{strings = }')  # to show that I am not changing the original list.
 

Выход:

 iwantthis
iwantthistoo
python
strings = ['stackasdf:5;iwantthis123jasdoverflow', 'iwantthistoo', 'asdf:5;python123jasd']