2009-11-25 6 views
0

Donc, voici ma question:Expression régulière pour correspondre à une chaîne uniquement lorsque certains caractères n'existent pas

J'ai un robot qui va et télécharge les pages Web et les bandes d'URL (pour l'avenir rampants). Mon robot fonctionne à partir d'une liste blanche d'URL qui sont spécifiées dans les expressions régulières, ils sont donc le long des lignes de:

(http://www.example.com/subdirectory/)(.*?)

... qui permettrait des URL qui ont suivi le modèle à rampé à l'avenir. Le problème que je vais avoir est que je voudrais exclure certains caractères dans les URL, de sorte que (par exemple) des adresses telles que:

(http://www.example.com/subdirectory/)(somepage?param=1&param=5#print)

... dans le cas ci-dessus, à titre d'exemple, je d aimer pouvoir exclure les URL qui ont la fonction?, #, et = (pour éviter d'explorer ces pages). J'ai essayé pas mal d'approches différentes, mais je ne peux pas sembler obtenir le droit:

(http://www.example.com/)([^=\?#](.*?))

etc. Toute aide serait vraiment apprécié!

EDIT: désolé, devrait l'ai mentionné est écrit en Python, et je suis normalement assez compétent dans regex (bien que cela m'a déconcerté)

EDIT 2: La réponse de VoDurden (celui accepté ci-dessous) presque donne le résultat correct, tout ce qu'il a besoin est le caractère $ à la fin de l'expression et il fonctionne parfaitement - par exemple:

(http://www.example.com/)([^=\?#]*)$

Répondre

0

Cette expression devrait être ce que vous cherchez:

(http://www.example.com/subdirectory/)([^=?#]*)$ 

[?^= \ #] Correspond à quoi que ce soit, sauf pour les caractères que vous avez spécifié.

Par exemple:

+0

Votre méthode a presque fonctionné - je l'ai essayée et ça a semblé ne pas fonctionner, j'ai donc ajouté $ à la fin, et ça semble fonctionner (ça va nécessiter plus de tests, mais votre méthode m'a juste sauvé beaucoup de temps!) : (http://www.example.com/subdirectory/)([^=\?#]*)$ – johneth

+0

Mise à jour de la réponse avec le $ final. Assurez-vous de laisser un commentaire si vous trouvez d'autres problèmes lors des tests :) –

0

Vous devrez explorer les pages jusqu'à ?param=1&param=5

parce que normalement param = 1 et param = 2 pourrait vous donner une page Web complètement différente.

ramasser un le site Web wordpress pour le confirmer.

Essayez comme celui-ci, il va essayer de correspondre juste avant # omble chevalier

(http://www.example.com/)([^#]*?) 
+0

Eh oui, le site que je rampants paramètres utilise, mais ceux-ci ne fournissent aucune différence dans le contenu des pages de sorte qu'il serait une perte pour ok, si vous êtes vraiment vraiment sûr que vous n'avez pas besoin de ces parties après? = #, utilisez comme d'autres suggèrent, (peeople suggèrent, (et pourquoi je veux exclure les URL qui contiennent des paramètres et #) – johneth

+0

[^ = \? #] *?), et voter/accepter les réponses à d'autres personnes répondent, à votre santé! :-) – YOU

1
(http://www.example.com/)([^=?#]*?) 

devrait le faire, cela permettra une URL qui ne contient pas les caractères que vous ne voulez pas.

Il pourrait cependant être un peu difficile d'étendre cette approche. Une meilleure option consiste à faire fonctionner le système à deux niveaux, c'est-à-dire un ensemble d'expressions rationnelles correspondantes et un ensemble d'expressions rationnelles de blocage. Alors seulement les URL qui passent les deux seront autorisées. Je pense que cette solution sera un peu plus transparente et flexible.

+0

Je n'y ai jamais pensé comme ça, je vais y aller – johneth

+0

Si vous le faites, veuillez accepter/upvote, sinon vous aurez une armée sans fin de regexers répondant à la question =). –

+0

La barre oblique inverse n'est pas nécessaire dans la classe de caractères. –

0

Je ne suis pas sûr de ce que vous voulez. Si vous wan't pour correspondre à tout ce qui ne containst pas?, # Et = alors la regex est

([^=?#]*) 
+0

Vous pouvez supprimer la barre oblique inverse - à l'intérieur de la classe de caractères, le? n'est pas un caractère spécial. –

+0

Bonne remarque :) Je viens de copier-coller sans réfléchir –

0

Comme alternative, il y a toujours le module urlparse qui est conçu pour l'analyse syntaxique urls.

from urlparse import urlparse 

urls= [ 
    'http://www.example.com/subdirectory/', 
    'http://www.example.com/subdirectory/index.php', 
    'http://www.example.com/subdirectory/somepage?param=1&param=5#print', 
    'http://www.example.com/subdirectory/index.php?param=1', 
] 

for url in urls: 
    # in python 2.5+ you can use urlparse(url).query instead 
    if not urlparse(url)[4]: 
     print url 

fournit les éléments suivants:

http://www.example.com/subdirectory/ 
http://www.example.com/subdirectory/index.php 
Questions connexes