Извлечение подстроки и ВКЛЮЧЕНИЕ ссылочных символов в извлечение

#python

Вопрос:

Я нашел эту часть кода в другом посте, и хотя мне удалось наткнуться на правильный вывод, я почти уверен, что есть более чистый способ сделать это.

Хотя есть много сообщений с похожими вопросами, я не нашел ни одного, где символы, по которым можно найти индекс, также включены в извлечение…

Я, по сути, ищу, чтобы извлечь B08BY4V3NW .

Может ли кто-нибудь поделиться более кратким способом достижения этой цели?

 s1 = "sp - disc - auto - B08BY4V3NW - 18cb mold" s2 = "B0"  print (s1[s1.index(s2) - len(""):-12])  

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

1. Вы согласны с использованием regex ?

2. len("") было бы просто 0, не так ли?

3. s1 Будет ли он всегда таким?

4. вы могли бы использовать что-то вроде этого: re.findall(s2 r"[a-zA-Z0-9] ", s1)

5. len(«») равен 0, да, но в сообщении, в котором я это нашел, у len было значение, и я не знаю, как удалить len и все равно заставить это работать…

Ответ №1:

Вы можете попробовать это :

 from nltk.tokenize import word_tokenize  tokens = word_tokenize(s1) str_match = [w for w in tokens if s2 in w]  

Редактировать :

 s1 = "sp - disc - auto - B08BY4V3NW - 18cb mold" s2 = "B0" tokens = str.split(s1)  

Тот str.split(s1) вернется :

 ['sp', '-', 'disc', '-', 'auto', '-', 'B08BY4V3NW', '-', '18cb', 'mold']  

Затем вы можете найти свою строку, следуя из списка:

1. Использование понимания списка

 str_match = [w for w in tokens if s2 in w]  print(str_match) ['B08BY4V3NW']  

2. Использование фильтра

 str_match = list(filter(lambda x: s2 in x, tokens))  print(str_match) ['B08BY4V3NW']  

3. Использование re

 import re str_match = [x for x in tokens if re.search(s2, x)]  print(str_match) ['B08BY4V3NW']  

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

 str_ = ''.join(str_match) type(str_)  str  

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

1. nltk возможно, это излишне, когда кажется s1.split() , что это сработает, но OP не дал никакого контекста, поэтому IDK.

2. Не могли бы вы привести пример того, как это будет выглядеть с помощью split()? Я уже пытался использовать это с индексацией местоположения s2, но также не смог заставить это работать…

3. @acaciagrove Я редактирую свой ответ