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 /
4 Réponses :
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.
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))
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.
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"
re.search ('www. + com', s) .group ()
Ce n'est pas toujours
www.
mon caractère fixe esthttp: //
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))
etprint (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érezr
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 étaithttps: //
. Pour capturer à la foishttp
ethttps: //
je l'ai fait comme ceci:http (s?): // ([^ /] *) /? < / code> car certaines chaînes peuvent avoir
http: //
tandis que d'autres peuvent avoirhttps: //
Voir ma réponse ci-dessous .