2017-11-02 4 views
0

Es geht um Inhaltsabmessungen auf einer Website. Diese link checker tool unterstützt Python Regex. Mit dem Link Checker möchte ich Informationen über nur eine Inhaltsdimension erhalten.Regex negative Lookahead-Zeichenfolge mit Sonderzeichen python

Ich möchte alle außer die mit der Zeichenfolge de_de (für die --no-follow-url Option) übereinstimmen.

https://www.example.com/int_en 
https://www.example.com/int_de 
https://www.example.com/de_de ##should not match or all others should match 
https://www.example.com/be_de 
https://www.example.com/fr_fr 
https://www.example.com/gb_en 
https://www.example.com/us_en 
https://www.example.com/ch_de 
https://www.example.com/ch_it 
https://www.example.com/shop 

Ich bin irgendwo dazwischen diesen Ansätzen stecken:

https:\/\/www.example.com\/\bde\_de 
https:\/\/www.example.com\/[^de]{2,3}[^de] 
https:\/\/www.example.com\/[a-z]{2,3}\_[^d][^e] 
https:\/\/www.example.com\/([a-z]{2,3}\_)(?!^de$) 
https:\/\/www.example.com\/[a-z]{2,3}\_ 
https:\/\/www.example.com\/(?!^de\_de$) 

Wie kann ich eine negative Vorschau verwenden, um eine Zeichenfolge mit einem Sonderzeichen (Unterstrich) übereinstimmen? Kann ich mit etwas so gehen

(?!^de_de$) 

Ich bin neu in Regex, jede Hilfe oder Eingabe ist willkommen.

+0

jeder '/ de_ *' sollte nicht übereinstimmen oder nur '/ de_de'? – Arman

+0

Versuchen Sie 'https: \/\/www.example.com \/(?! de_de (?: \/| $)) [A-z -] +' –

+0

@Arman de_de sollte nicht übereinstimmen, jede andere Dimension sollte. Ich möchte/int_de,/de_en,/ch_de,/shop, ... mit der Option --no-follow-url abgleichen. –

Antwort

0

Sie könnten versuchen:

https:\/\/www.example.com\/.+?(?<!de_de)\b 

Das passt:

https://www.example.com/shop 

aber nicht:

https://www.example.com/de_de 

Pythex Link here

Erläuterung: hier verwenden wir eine negat ive Blick hinter (?<!de_de) an einer Wortgrenze angewendet (\b). Dies bedeutet, dass wir eine Wortgrenze finden müssen, die nicht "de_de" vorausgeht.

1

Verwenden Sie die folgende regex:

https://www\.example\.com/(?!de_de(?:/|$))[a-z_]+ 

die regex demo See. Wenn Sie auch http zuordnen möchten, fügen Sie s? nach http im Muster https?://www\.example\.com/(?!de_de(?:/|$))[a-z_]+ hinzu.

Beachten Sie, dass Sie die Punkte so entziffern sollten, dass sie den echten Buchstabenpunkten in der Zeichenfolge entsprechen. Der (?!de_de(?:/|$))[a-z_]+ Teil entspricht 1 + Buchstaben/Unterstrichen (siehe [a-z_]+), die nicht de_de sind, gefolgt von / oder Ende der Zeichenfolge.

Python demo:

import re 
ex = ["https://www.example.com/int_en","https://www.example.com/int_de","https://www.example.com/de_de","https://www.example.com/be_de","https://www.example.com/de_en","https://www.example.com/fr_en","https://www.example.com/fr_fr","https://www.example.com/gb_en","https://www.example.com/us_en","https://www.example.com/ch_de","https://www.example.com/ch_it"] 
rx = r"https://www\.example\.com/(?!de_de(?:/|$))[a-z_]+" 
for s in ex: 
    m = re.search(rx, s) 
    if m: 
     print("{} => MATCHED".format(s)) 
    else: 
     print("{} => NOT MATCHED".format(s)) 

Ausgang:

https://www.example.com/int_en => MATCHED 
https://www.example.com/int_de => MATCHED 
https://www.example.com/de_de => NOT MATCHED 
https://www.example.com/be_de => MATCHED 
https://www.example.com/de_en => MATCHED 
https://www.example.com/fr_en => MATCHED 
https://www.example.com/fr_fr => MATCHED 
https://www.example.com/gb_en => MATCHED 
https://www.example.com/us_en => MATCHED 
https://www.example.com/ch_de => MATCHED 
https://www.example.com/ch_it => MATCHED 
+0

Ich ging mit @ gil.fernandes 'Lösung und fügte hinzu? zum https-Teil.Ich brauchte keinen Python-Code, nur die RegEx :) Trotzdem danke für die Erklärung. –

+0

@SeviS Beachten Sie, dass [* das * Regex möglicherweise etwas entspricht, was Sie nicht erwarten] (https://regex101.com/r/mBcm5c/2). Außerdem gibt es keinen Punkt, der '/' in einem Python Regex entkommt. –

+0

Ich habe diese Website https://regexr.com/ zum Testen verwendet, wo das Escaping erforderlich war, da die Site die integrierte Regex-Syntax des Browsers verwendet. Ist es ein erwartetes Verhalten, da der vollständige Stopp '.'" irgendein einzelnes Zeichen "ist? Ich werde die Flucht in Zukunft für den vollen Stopp gebrauchen, das ist der richtige Weg, denke ich? https://regex101.com/r/mBcm5c/3 Nochmals vielen Dank. –