Как я могу совместить начало и конец в регулярном выражении 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))