Как я могу совместить начало и конец в регулярном выражении Python?

У меня есть строка, и я хочу что-то сопоставить в начале и в конце с одним шаблоном поиска. Как это может быть сделано?

Скажем, у нас есть строка вроде:

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

Я хочу сделать что-то вроде этого:

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

Очевидно, это неверно, но я надеюсь, что это будет иметь смысл. Возможно ли это?

Ответы

Ответ 1

re.match будет соответствовать строке в начале, в отличие от re.search:

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

Здесь можно отметить две вещи:

  • r'' используется для строкового литерала, чтобы сделать его тривиальным, чтобы иметь обратную косую черту внутри регулярного выражения.
  • string - стандартный модуль, поэтому я выбрал s как переменную
  • Если вы используете регулярное выражение несколько раз, вы можете использовать r = re.compile(...) для создания конечного автомата один раз, а затем использовать r.match(s) впоследствии для соответствия строкам

Если вы хотите, вы также можете использовать модуль urlparse для анализа URL-адреса для вас (хотя вам все равно нужно извлечь расширение ):

>>> 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

Ответ 2

Как вообще не использовать регулярное выражение?

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

Вам не кажется, что это лучше читается?

Вы можете также поддерживать несколько параметров для начала и конца:

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

Ответ 3

Не жадно, используйте ^ftp://(.*?)\.jpg$

Ответ 4

Try

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

если вы хотите искать регулярные выражения. Обратите внимание, что вам нужно избежать периода, потому что оно имеет особое значение в регулярных выражениях.

Ответ 5

import re

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