web-dev-qa-db-fra.com

Extraire la chaîne avec Python re.match

import re
str="x8f8dL:s://www.qqq.zzz/iziv8ds8f8.dafidsao.dsfsi"

str2=re.match("[a-zA-Z]*//([a-zA-Z]*)",str)
print str2.group()

current result=> error
expected => wwwqqqzzz

Je veux extraire la chaîne wwwqqqzzz. Comment je fais ça?

Il y a peut-être beaucoup de points, tels que:

"whatever..s#[email protected].:af//wwww.xxx.yn.zsdfsd.asfds.f.ds.fsd.whatever/123.dfiid"

Dans ce cas, je veux essentiellement les éléments délimités par // Et /. Comment puis-je y parvenir?

Une question supplémentaire:

import re
str="xxx.yyy.xxx:80"

m = re.search(r"([^:]*)", str)
str2=m.group(0)
print str2
str2=m.group(1)
print str2

Semble que m.group(0) et m.group(1) sont identiques.

22
runcode

match essaie de faire correspondre la chaîne entière . Utilisez search à la place. Le modèle suivant correspondrait alors à vos besoins:

m = re.search(r"//([^/]*)", str)
print m.group(1)

Fondamentalement, nous recherchons /, puis consommez autant de caractères non slash que possible. Et ces caractères non slash seront capturés dans le groupe numéro 1.

En fait, il existe une technique légèrement plus avancée qui fait de même, mais ne nécessite pas de capture (ce qui prend généralement beaucoup de temps). Il utilise un soi-disant lookbehind :

m = re.search(r"(?<=//)[^/]*", str)
print m.group()

Les contournements ne sont pas inclus dans la correspondance réelle, d'où le résultat souhaité.

Cette (ou toute autre solution d'expressions rationnelles raisonnables) ne supprimera pas le .s immédiatement. Mais cela peut facilement se faire dans un deuxième temps:

m = re.search(r"(?<=//)[^/]*", str)
Host = m.group()
cleanedHost = Host.replace(".", "")

Cela ne nécessite même pas d'expressions régulières.

Bien sûr, si vous souhaitez tout supprimer sauf les lettres et les chiffres (par exemple, pour tourner www.regular-expressions.info into wwwregularexpressionsinfo) alors il vaut mieux utiliser la version regex de replace:

cleanedHost = re.sub(r"[^a-zA-Z0-9]+", "", Host)
38
Martin Ender
print re.sub(r"[.]","",re.search(r"(?<=//).*?(?=/)",str).group(0))

Voir cette démo.

3
Ωmega
output=re.findall("(?<=//)\w+.*(?=/)",str)

final=re.sub(r"[^a-zA-Z0-9]+", "", output [0])

print final
2
John F