2012-03-30 8 views
15

Ich habe eine Zeichenfolge und ich möchte etwas am Anfang und Ende mit einem einzigen Suchmuster übereinstimmen. Wie kann das gemacht werden?Wie kann ich den Anfang und das Ende in Pythons Regex anpassen?

Lassen Sie uns sagen, dass wir einen String haben wie:

string = "ftp://www.somewhere.com/over/the/rainbow/image.jpg" 

ich so etwas wie dies tun wollen:

re.search("^ftp:// & .jpg$" ,string) 

Offensichtlich ist es falsch ist, aber ich hoffe, dass es über meinen Punkt. Ist das möglich?

+1

Hast du daran gedacht, die Dokumente zu überprüfen? – Marcin

Antwort

13

re.match wird match the string at the beginning, im Gegensatz zu re.search verwenden:

re.match(r'(ftp|http)://.*\.(jpg|png)$', s) 

Zwei Dinge zu beachten:

  • r'' für die Zeichenfolge verwendet wird, wörtlich, um es trivial zu machen, Backslashes in der Regex
  • zu haben
  • string ist ein Standardmodul, so wählte ich s als Variable
  • Wenn Sie einen Regex mehr als einmal verwenden, können Sie r = re.compile(...) gebaut die Zustandsmaschine einmal verwenden und r.match(s) dann anschließend verwenden, um die Saiten entsprechen

Wenn Sie möchten, können Sie auch das urlparse Modul verwenden, um die URL für Sie zu analysieren (obwohl Sie noch die Erweiterung extrahieren müssen):

>>> allowed_schemes = ('http', 'ftp') 
>>> allowed_exts = ('png', 'jpg') 
>>> from urlparse import urlparse 
>>> url = urlparse("ftp://www.somewhere.com/over/the/rainbow/image.jpg") 
>>> url.scheme in allowed_schemes 
True 
>>> url.path.rsplit('.', 1)[1] in allowed_exts 
True 
15

Wie wäre es mit einem regulären Ausdruck überhaupt nicht?

if string.startswith("ftp://") and string.endswith(".jpg"): 

Glauben Sie nicht, dass dies besser liest?

if (string.startswith(("ftp://", "http://")) and 
    string.endswith((".jpg", ".png"))): 
+0

würde ich, aber es ist komplizierter, weil es eine Anzahl gültige Anfangs- und Endsequenzen gibt. Wenn ich wüsste, wie man diesen einfachen Fall macht, könnte ich es mit der komplizierteren Realität arbeiten lassen. :) –

+1

@Google: Sie können auch nach mehreren Zeichenfolgen suchen, siehe mein Update. –

3

Versuchen

re.search(r'^ftp://.*\.jpg$' ,string) 

wenn Sie einen regulären Ausdruck suchen wollen:

Sie können auch mehrere Optionen für die Start- und Ziel unterstützen. Beachten Sie, dass Sie die Periode umgehen müssen, da sie in regulären Ausdrücken eine besondere Bedeutung hat.

2
import re 

s = "ftp://www.somewhere.com/over/the/rainbow/image.jpg" 
print(re.search("^ftp://.*\.jpg$", s).group(0)) 
Verwandte Themen