1
votes

Comment extraire une chaîne vient toujours après une chaîne spécifique et éventuellement suivie d'une chaîne

Si j'ai une chaîne, le est toujours précédé de http: // , et éventuellement suivi de / . Exemple:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

Mais parfois peut être au format: http://www.mymovies.com

Je souhaite extraire www .mymoviews.com Je veux capturer les deux formats (avec / sans le /)

J'ai essayé d'utiliser:

import re
print(re.search('http://(.*)/','http://www.mymovies.com').group(1))

Mais j'obtiens ceci erreur:

http://www.mymovies.com/

1) Comment résoudre l'erreur 2) Comment capturer les deux avec / sans le caractère / suivant (car ma solution nécessite /


10 commentaires

re.search ('www. + com', s) .group ()


Ce n'est pas toujours www. mon caractère fixe est http: // comme je l'ai indiqué dans la question.


Essayez http: // ([^ /] *) /? , voir ceci démo regex


@Wiktor Stribiżew Comment l'essayer? en utilisant re? Pouvez-vous écrire la ligne complète plz.


Oui, re suffit. print (re.search (r'http: // ([^ /] *) /?','http://www.mymovies.com‌ ') .group (1)) et print (re.search (r'http: // ([^ /] *) /?','http://www.mymovies.com‌ /').group(1)) . Je ne sais pas à quels autres types d'URL vous voulez faire correspondre, c'est donc une suggestion.


@Wiktor Stribiżew Pourquoi un petit r avant la chaîne?


Voir Qu'est-ce qu'un " raw string regex »et comment l'utiliser? . Dans un tel littéral de chaîne, tous les \ sont traités comme des barres obliques inverses littérales. Lectures complémentaires si vous êtes intrigué . Eh bien, considérez r une meilleure pratique lors de la définition de modèles d'expression régulière en Python.


Avez-vous d'autres cas de test? Un ensemble de règles de quel type d'entrée la regex doit correspondre ou éviter la correspondance?


@Wiktor Stribiżew vôtre est la bonne réponse. L'erreur apparaît car la chaîne commence par http: // et mon code réel était https: // . Pour capturer à la fois http et https: // je l'ai fait comme ceci: http (s?): // ([^ /] *) /? < / code> car certaines chaînes peuvent avoir http: // tandis que d'autres peuvent avoir https: //


Voir ma réponse ci-dessous .


4 Réponses :


0
votes

Votre chaîne de recherche est http: // (. *) / , donc le / à la fin est obligatoire. Si vous mettez un ? après cela, vous le rendez facultatif, ou vous pouvez simplement le laisser complètement de côté. Si vous ne voulez pas qu'il fasse partie de la chaîne résultante, limitez les caractères correspondants avant à tout sauf /:

if result[-1] == "/": result = result[:-1]

ou faites un simple dernier -character-check après l'opération et supprimez-le s'il s'agit d'un /:

https://([^/]*)

Il convient également de noter que si votre entrée peut être des URL complètes (y compris les chemins et les paires ? key = value ), vous devez restreindre davantage les caractères correspondants.


0 commentaires

0
votes

Essayez Regex: (?<=http:\/\/)\[^\/\ +?(?=\/|$)

Démo


0 commentaires

1
votes

Vous pouvez utiliser

import re
strs = ['http://www.mymovies.com/','http://www.mymovies.com','https://www.mymovies.com/','https://www.mymovies.com']
r = re.compile(r'https?://([^/]*)/?')
for s in strs:
    m = r.search('http://www.mymovies.com')
    if m:
        print(m.group(1))

Voir la démo regex a >

Détails

  • http - http sous-chaîne
  • s? - 1 ou 0 s caractères
  • : // - une sous-chaîne : //
  • ([^ /] *) - Groupe de capture 1: zéro ou plusieurs caractères autres que /
  • /? - 1 ou 0 caractères / .

Démo Python (imprime quatre www.mymovies.com en sortie):

m = re.search(r'https?://([^/]*)/?','http://www.mymovies.com')
if m:
    print(m.group(1))


5 commentaires

Voulez-vous dire http - sous-chaîne https (vous avez oublié 's')


@ user9371654 Je n'ai pas oublié les s , voir https? dans le motif: il correspond à http ou https depuis < code> s? correspond à un s facultatif, c'est-à-dire 1 ou 0 caractère s .


pouvez-vous vérifier le premier point? c'est ce que je veux dire.


@ user9371654 C'est très bien, car il est suivi du deuxième point. Veuillez voir le modèle dans son intégralité.


Maintenant j'ai ce que tu veux dire. Pardon.



0
votes

Vous pouvez le faire sans expressions régulières en utilisant la méthode split ():

url.split("/")[2]

'http://www.mymovies.com/'.split("/")[2] ==> "www.mymovies.com"

'http://www.mymovies.com'.split("/")[2] ==> "www.mymovies.com"

'http://www.mymovies.com/star-wars/episodeV'.split("/")[2] ==> "www.mymovies.com"


0 commentaires