0
votes

Python - Split, regex et condition

J'ai un artiste cible et j'aimerais récupérer son identifiant de correspondant, comme: xxx pré>

mais mon si code> condition ne fonctionne pas pour l'artiste cible. Je n'imprime aucun résultat. P>

Quelle est la meilleure façon de réaliser cela à l'aide d'un pour code> boucle ou autrement, en considérant que la liste réelle est très grande? P>

Je veux aller au-dessus de "vg1jyl3cr60" p>


éditer strong>: @Alexandre Cécile. Je poste ici la fonction entière qui appelle YouTube API, si vous souhaitez perfectionner la fonction qui réduit la recherche de vidéos d'artiste, une fois que vous passez le titre de titre et le nom de l'artiste. Vous aurez besoin d'une clé pour cela, cependant. P>

from google.oauth2 import service_account


def youtube_id(track_name, target_artist):

    GET_CREDENTIALS = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
    PASS_CREDENTIALS = 
    service_account.Credentials.from_service_account_file(GET_CREDENTIALS)
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"
    DEVELOPER_KEY = "mykey"

    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, credentials=PASS_CREDENTIALS,
    developerKey=None)
    # Call the search.list method to retrieve results matching the specified
    # query term.
    search_response = youtube.search().list(
    q=track_name,
    part="id,snippet",
    #maxResults=track_name.max_results
    ).execute()

    videos = []
    videos_ids = []
    channels = []
    playlists = []

    # Add each result to the appropriate list, and then display the lists of
    # matching videos, channels, and playlists.
    for search_result in search_response.get("items", []):
        if search_result["id"]["kind"] == "youtube#video":
            videos.append("%s (%s)" % (search_result["snippet"]["title"],
                                 search_result["id"]["videoId"]))
            videos_ids.append("%s" % (search_result["id"]["videoId"]))
        elif search_result["id"]["kind"] == "youtube#channel":
            channels.append("%s (%s)" % (search_result["snippet"]["title"],
                                   search_result["id"]["channelId"]))
        elif search_result["id"]["kind"] == "youtube#playlist":
            playlists.append("%s (%s)" % (search_result["snippet"]["title"],
                                    search_result["id"]["playlistId"]))

    print ("Videos:\n", "\n".join(videos), "\n")
    print ("Channels:\n", "\n".join(channels), "\n")
    print ("Playlists:\n", "\n".join(playlists), "\n")

    ids=[]
    for video in videos:
        artist = re.split(r'\s*-\s*', video)[0]
        id = re.search(r'.*\(([^)]+)', video)[1]
        if id and artist == target_artist:
            videos_ids.append(id)
            print ('VIDEOS IDS',  videos_ids)

    return videos_ids[-1] 


7 commentaires

Je suppose que cela devrait être item.split ('-')


ID d'impression -> impression (id)


D'où vient votre liste? Vous mentionnez des performances et qu'il est assez important, il va donc déterminer la meilleure solution.


@ Alexandercélile python2?


Python3.7, monsieur.


@ Dekekeden toujours une possibilité, mais improbable imo.


Si vous n'utilisez pas de crochets dans la déclaration d'impression et que vous allez terminer.


5 Réponses :


-1
votes

Méthode 1

Peut-être, ce qui suit pourrait être un peu plus proche: xxx

sortie xxx
< p> Si vous souhaitez simplifier / modifier / explorer l'expression, il a été expliqué sur le panneau supérieur droit de Regex101.com . Si vous le souhaitez, vous pouvez également regarder dans Ce lien , comment cela correspondrait Contre quelques échantillons d'entrée.

Méthode 2

Juste au cas où, vous aurez peut-être eu un nombre inconnu d'espaces, alors nous prenions des avantages de re.split () : xxx

sortie xxx


2 commentaires

Vous sortie vidéo [0] , il devrait être le dernier élément en fonction de l'OP


Et ici l'identifiant, qui est toujours le dernier article Votre code ne saisit pas le dernier élément.



1
votes

Lorsque vous divisez l'artiste de la piste, vous fractionnez sur '-' . Si vous regardez les chaînes réelles, vous verrez qu'il y a une espace blanche autour de l'union d'union, qui sera incluse dans le résultat scindinal.

La solution consiste à .Strip () L'artiste variable pour se débarrasser de la blancheur.


0 commentaires

0
votes

Vous pouvez modifier votre code ci-après, fixant le problème de la division et saisir l'ID (ou quoi que ce soit entre la parathèse): xxx

sortie: xxx

Si votre sortie souhaitée est juste VG1JYL3CR60 Comme indiqué dans l'OP, vous voudrez casser la boucle une fois que le premier identifiant est imprimé

regardant Les données plus étroitement, il n'est pas toujours précis exactement lorsque le nom de l'artiste se produit (comme pour Linkin Park et Lagola) afin que l'approche actuelle présente des défauts qui ne soient pas adressés dans aucune des réponses


3 commentaires

re.search obtiendra le premier élément - le dernier élément est recherché.


"Regardant les données plus étroitement, il n'est pas toujours clair exactement lorsque le nom de l'artiste se produit (comme pour Linkin Park et Lagola) afin que l'approche actuelle a des défauts qui ne soient pas adressés dans aucune des réponses"


pense que tout le monde (y compris moi-même) s'est rattrapé pour le faire fonctionner pour l'exemple spécifique: D



0
votes

Le problème que vous rencontrez est principalement dû à un espace présent à la fin de votre match (puisque - code> scissure sur - code> et laisse l'espace derrière elle) . Tcode ci-dessous devrait fonctionner pour vous. Il utilise re.split code> pour scinder sur \ s *-\ s * code> (n'importe quel nombre d'espaces, suivi de - code>, suivi d'un numéro des espaces).

J'ai aussi nettoyé certaines des autres parties de votre code. J'ai ajouté . * Code> au début de votre deuxième regex pour capturer uniquement la dernière instance (et modifié [0] code> sur [1] code> pour obtenir Le contenu capturé au lieu de tout le match). p>

La dernière partie vérifie la dernière partie pour voir si ID code> existe et si artiste == cible code> avant l'impression.

Voir le code utilisé ici P>

Vg1jyL3cr60
WQYsGWh_vpE
  • \ s * - \ s * code> Ce modèle correspond - code> et n'importe quel blancheur autour d'eux
    • \ s * code> correspond à n'importe quel caractère de blanchiment n'importe quel nombre de fois li>
    • - code> correspond à ce caractère littéralement li>
    • \ s * code> correspond à n'importe quel caractère de blanchiment n'importe quel nombre de fois li> ul> li>
    • . * \ ((([^)] +) code> Ce modèle correspond à la dernière instance de la parenthèse gauche dans une chaîne
      • . * code> correspond à n'importe quel caractère de fois (c'est ainsi que nous pouvons nous assurer que nous assurerons la dernière parenthèse car il est gourmand et correspondra autant de caractères possible) LI>
      • \ ( code> correspondez ( code> littéralement li>
      • ([^)] +) code> capture les éléments suivants
        • [^)] + code> correspond à un ou plusieurs de n'importe quel caractère sauf ) code> li> ul> li> ul> li> ul> p>


6 commentaires

Pouvez-vous expliquer votre artiste Regex? Je ne suis pas sûr de le comprendre complètement.


Sur la chaîne "Besoin de vitesse (Linkin Park - Roads Untraveled) Vidéo musicale (7LKQ7BF6KU8)", le code ne produira pas de manière incorrecte "besoin de vitesse (Linkin Park" pour le nom de l'artiste?


@ Alexandercémécile Oui, mais votre question ne couvre pas ce cas (et quel est le résultat attendu pour cette chaîne.


Quelle question?


@ Alexandercécile Désolé, cette question. Selon l'OP, la cible est avant le premier -


Hein, il ne le dit pas, il semble juste de cette façon à cause de son code. Son code est vraiment brisé et la chaîne que j'ai partagée est un contre-exemple parfait, alors j'espère qu'il finit par expliquer les choses un peu plus. Jusque-là, nous ne pouvons pas être certains, malheureusement. Tant pis!



0
votes

D'accord, voici un exemple de travail complet avec une nouvelle regex. Il extrait l'identifiant de la vidéo, le nom / le titre, et c'est tout. Je voulais éviter de faire un tas d'hypothèses sur le format du titre de la vidéo, car il semble ne suivre aucun modèle ou format particulier.


xxx

laissez-moi savoir si vous avoir d'autres questions! :)


8 commentaires

très agréable. Mais l'esprit que, dans la question, j'ai besoin d'une solution qui passe un artiste cible et renvoie seulement l'ID vidéo pour tout identifiant vidéo concernant cette cible. Dans l'exemple ci-dessus, passez à Portishead comme un argument et retourne un identifiant vidéo pour cet artiste. J'accepterais et évite si vous encapsulez cela dans une fonction qui passe la cible et l'identifiant de retour si l'artiste est trouvé.


@Data_garden Comment pouvons-nous extraire / identifier le nom de l'artiste de manière cohérente? Pour autant que je sache, les titres ne suivent aucun modèle qui rendrait cela possible.


@Data_Garden aurait dû préciser que mon commentaire est basé sur la quantité limitée d'informations partagées dans votre message. Selon l'endroit où les données proviennent, le reste de votre programme et son objectif, etc., il pourrait y avoir une solution.


Nous passons le nom du artiste. C'est pourquoi c'est cible et que «pourquoi j'ai utilisé comme conditionnement. qui suffit pour cette question


Comme pour l'élément dans vid_info_lst: si cible_artiste dans l'élément [0]: Imprimer (Item [1])


cible_artiste = 'Portishead'


@Data_Garden Laissez-moi reformuler ma question: Comment vérifions-nous uniquement un nom d'artiste et le titre d'une vidéo, que l'artiste a créé / correspond à cette vidéo. Par exemple, qui est l'artiste de ce titre: "Besoin de vitesse (Linkin Park - Roads non construits) Vidéo musicale (KD3S20GMPVE)" C'est une question triviale pour un être humain et un extrêmement difficile pour un ordinateur. Le code que vous venez de partager utilise une vérification de sous-chaîne simple, qui est malheureusement incroyablement inefficace.


Laissez-nous Continuez cette discussion en chat .