J'ai une liste de chaînes (voir ci-dessous). Je veux obtenir les éléments de la liste en recherchant deux jetons spécifiques (début et fin), puis enregistrer toutes les chaînes présentes entre ces jetons.
Par exemple, j'ai la liste ci-dessous et je veux obtenir toutes les chaînes entre tout occurrence des chaînes 'RATED' et 'Like' . Il peut également y avoir plusieurs occurrences de ces sous-séquences.
['RATED', ' Awesome food at a good price .', 'Delivery was very quick even on New Year\xe2\x80\x99s Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', 'Like', '1', 'Comment', '0', 'Share', 'Divyansh Agarwal', '1 Review', 'Follow', '3 days ago', 'RATED', ' I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone", 'Like']
J'ai essayé différentes méthodes, comme regex, mais aucune n'a résolu le problème.
7 Réponses :
Vous pouvez essayer, par exemple,
#[' Awesome food at a good price .', # 'Delivery was very quick even on New Yearâs Eve .', # 'Please try crispy corn and veg noodles From this place .', # 'Taste maintained .', # ' I have tried schezwan noodles and the momos with kitkat shake', # "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone"]
résultat
rec = False
result = []
for s in lst:
if s == 'Like':
rec = False
if rec:
result.append(s)
if s == 'RATED':
rec = True
Si le résultat souhaité est une liste de mots, il peut être utile de remplacer result.append (s) par result.extend (s.strip (). Split ('')) < / code>
def find_between(old_list, first_word, last_word):
new_list = []
flag = False
for i in old_list:
if i is last_word:
break
if i is first_word:
flag = True
continue
if flag:
new_list.append(i)
return new_list
Vous pouvez utiliser une expression régulière Vous devez d'abord rejoindre votre liste avec un délimiteur qui n'apparaîtra pas dans le texte
for s in results:
print(s.split(delimiter))
Après cela, vous pourrez utiliser une expression régulière
results = re.findall(r'#\$#RATED#\$#(.*?)#\$#Like#\$#', bigString)
Maintenant il vous suffit d'itérer tous les résultats et de séparer la chaîne avec un délimiteur
delimiter = "#$#" bigString = delimiter + delimiter.join(yourList) + delimiter
Vous avez toujours une partie de votre délimiteur dans la première et la dernière chaîne des listes d'impression.
Merci pour le commentaire. J'ai fait un changement dans l'expression régulière.
en utilisant regex, vous pouvez le faire de la manière suivante.
[' Awesome food at a good price . Delivery was very quick even on New Yearâs Eve . Please try crispy corn and veg noodles From this place . Taste maintained . ', " I have tried schezwan noodles and the momos with kitkat shake And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone "]
sortie
a= ['RATED',' Awesome food at a good price .', 'Delivery was very quick even on New Yearâs Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', 'Like', '1', 'Comment', '0', 'Share', 'Divyansh Agarwal', '1 Review', 'Follow', '3 days ago', 'RATED', ' I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone", 'Like'] import re string = ' '.join(a) b = re.compile(r'(?<=RATED).*?(?=Like)').findall(string) print(b)
Merci. C'est exactement ce que je voulais :)
Je vous suggère de vous renseigner sur la recherche d'index et le découpage des types de séquence:
Exemple:
[' Awesome food at a good price .', 'Delivery was very quick even on New Yearâs Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .'] [' I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone"]
Le résultat est:
def group_between(lst, start_token, end_token):
while lst:
try:
# find opening token
start_idx = lst.index(start_token) + 1
# find closing token
end_idx = lst.index(end_token, start_idx)
# output sublist
yield lst[start_idx:end_idx]
# continue with the remaining items
lst = lst[end_idx+1:]
except ValueError:
# begin or end not found, just skip the rest
break
l = ['RATED',' Awesome food at a good price .', 'Delivery was very quick even on New Yearâs Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', 'Like',
'1', 'Comment', '0', 'Share', 'Divyansh Agarwal', '1 Review', 'Follow', '3 days ago',
'RATED', ' I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone", 'Like'
]
for i in group_between(l, 'RATED', 'Like'):
print(i)
Une option sans indicateur:
new_list = []
group = [] # donât need if the list starts with 'RATED'
for i in your_list:
if i == 'RATED':
group = []
elif i == 'Like':
new_list.append(group[:])
else:
group.append(i)
for simple: l = ['RATED',' Awesome food at a good price .', 'Delivery was very quick even on New Yearâs Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', 'Like',
'1', 'Comment', '0', 'Share', 'Divyansh Agarwal', '1 Review', 'Follow', '3 days ago',
'RATED', ' I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone", 'Like'
]
st, ed, aa = None, None, []
for k, v in enumerate(l):
if v == "RATED":
st = k
if v == "Like":
ed = k
if st != None and ed!= None:
aa.extend(l[st+1: ed])
st = None
ed = None
print (aa)
# [' Awesome food at a good price .', 'Delivery was very quick even on New Yearâs Eve .', 'Please try crispy corn and veg noodles From this place .', 'Taste maintained .', ' I have tried schezwan noodles and the momos with kitkat shake', "And I would say just one word it's best for the best reasonable rates.... Gotta recommend it to everyone"]
Alors pour les mots récurrents, voulez-vous utiliser le premier comme limite? Veuillez fournir votre résultat attendu en plus de ce que vous avez essayé.
La sortie attendue n'est rien d'autre qu'une liste de mots contenant les mots entre ces deux mots à l'exclusion de ceux-ci.