2013-01-23 4 views
0

J'essaie de comprendre comment utiliser les expressions régulières en Python pour extraire certaines URL dans les chaînes. Par exemple, je pourrais avoir 'blahblahblah (a href = "example.com")'. Dans ce cas, je veux extraire tous les liens "example.com". Comment puis-je faire cela au lieu de simplement séparer la chaîne?Python Regex Tokenize

Merci!

+5

Vos chaînes sont-elles HTML? Si c'est le cas, n'utilisez pas regex. Si ce n'est pas le cas, il existe certainement de nombreuses expressions régulières correspondant aux URI. Vous pourriez essayer de donner une chance à l'un d'entre eux et revenir pour poser une question plus précise si vous êtes coincé. – bernie

+0

S'il vous plaît ne pas oublier de laisser un commentaire aux répondants et à upvote ceux que vous avez trouvé utile! :) – mac

Répondre

1

Il existe un excellent module appelé BeautifulSoup (lien: http://www.crummy.com/software/BeautifulSoup/) qui est idéal pour l'analyse HTML. Vous devriez utiliser ceci au lieu d'utiliser regex pour obtenir des informations à partir du HTML. Voici un exemple de BeautifulSoup:

>>> from bs4 import BeautifulSoup 
>>> html = """<p> some <a href="http://link.com">HTML</a> and <a href="http://second.com">another link</a></p>""" 
>>> soup = BeautifulSoup(html) 
>>> mylist = soup.find_all('a') 
>>> for link in mylist: 
... print link['href'] 
http://link.com 
http://second.com 

Voici un lien vers la documentation, ce qui est vraiment facile à suivre: http://www.crummy.com/software/BeautifulSoup/bs4/doc/

0

Regex sont des outils très puissants, mais ils pourraient ne pas être votre outil dans toutes les circonstances (comme d'autres l'ont déjà suggéré). Cela dit, voici un exemple minimal de la console qui utilise - selon la demande - regex:

>>> import re 
>>> s = 'blahblahblah (a href="example.com") another bla <a href="subdomain.example2.net">' 
>>> re.findall(r'a href="(.*?)"', s) 
['example.com', 'subdomain.example2.net'] 

Mettre l'accent sur r'a href="(.*?)"'. En França il se traduit par: « trouver une chaîne commençant par a href=", puis enregistrez en conséquence aucun caractère jusqu'à ce que vous frappez la prochaine " La syntaxe est:.

  • le () signifie « sauver des choses que ici »
  • les . signifie « tout caractère »
  • les * signifie « un certain nombre de fois »
  • le ? signifie « non gourmand » ou en d'autres termes: trouver la plus courte chaîne qui satisfont aux exigences (essayez sans point d'interrogation et tu verras ce qui s'est passé ns).

HTH!

0

Ne pas utiliser regexp:

Voici pourquoi vous devriez not think at regex en premier lieu lorsqu'ils traitent avec HTML ou XML (ou URL).

Si vous souhaitez utiliser regex de toute façon,

Vous pouvez trouver plusieurs modèle qui font le travail, et plusieurs façons d'aller chercher les chaînes que vous souhaitez trouver.

Ces modèles font le travail:

r'\(a href="(.*?)"\)'

r'\(a href="(.*)"\)'

r'\(a href="(+*)"\)'

1. re.findall()

re.findall(pattern, string, flags=0) 

Retour tous les matchs ne se chevauchent pas de motif dans la chaîne, comme une liste de chaînes . La chaîne est numérisée de gauche à droite et les correspondances sont renvoyées dans l'ordre trouvé. Si un ou plusieurs groupes sont présents dans le modèle, renvoie une liste de groupes; ce sera une liste de tuples si le motif a plus d'un groupe. Les matchs vides sont inclus dans le résultat à moins qu'ils ne touchent le début d'un autre match.

import re 
st = 'blahblahblah (a href="example.com") another bla <a href="polymer.edu">' 
re.findall(r'\(a href="(+*)"\)',s) 

2. re.search()

re.search(pattern, string, flags=0)

parcourons chaîne à la recherche d'un endroit où le motif d'expression régulière produit un match, et retourner un correspondant Instance MatchObject.

Puis, passez à re.group() par groupes. Par exemple, en utilisant regex r'\(a href="(.+?(.).+?)"\)', qui fonctionne également ici, vous avez plusieurs groupes fermés: le groupe 0 correspond au modèle entier, le groupe 1 correspond au premier sous-modèle entouré entouré de parenthèses,

Vous utiliseriez la recherche lors de la recherche de la première occurrence du modèle uniquement. Et avec votre exemple ce serait

>>> st = 'blahblahblah (a href="example.com") another bla (a href="polymer.edu")' 
>>> m=re.search(r'\(a href="(.+?(.).+?)"\)', st) 
>>> m.group(1) 
'example.com'