Как извлечь имя изображения с помощью регулярных выражений Python?

Кажется, что проблема с Regex и границей слов \b соответствует началу строки с начальным символом из нормального диапазона в 256 байт.

Вместо использования \b попробуйте использовать (?:^|\\s)

var title = "this is simple string with finnish word tämä on ääkköstesti älkää ihmetelkö";
// Does not work
var searchterm = "äl";

// does not work
//var searchterm = "ää";

// Works
//var searchterm = "wi";

if ( new RegExp("(?:^|\\s)"+searchterm, "gi").test(title) ) {
    $("#result").html("Match: ("+searchterm+"): "+title);
} else {
    $("#result").html("nothing found with term: "+searchterm);   
}

Breakdown:

(?: скобки () образуют группу захвата в Regex. Скобка начинается с вопросительного знака, а двоеточие ?: формирует группу, не связанную с захватом. Они просто группируют термины вместе

^ символ каретки совпадает с началом строки

|, бар является оператором «или».

\s соответствует пробелу (отображается как \\s в строке, потому что нам нужно избежать обратного слэша)

) закрывает группу

So вместо использования \b, который соответствует границам слов и не работает для символов Юникода, мы используем группу, не связанную с захватом, которая соответствует началу строки ИЛИ пробела.

2
задан Dimi 27 February 2019 в 14:57
поделиться

3 ответа

([\w\s.-]) (любой из [A-Za-z0-9_], пробелы, литерал ., литерал -) захватывает L в Logo, потому что это следует:

  • [117 ]: любой отдельный символ; o в данном случае
  • [jpg]: любой из j, p, g; g здесь

Вам нужно:

/([^/]+)\.jpg$

Теперь единственная захваченная группа будет содержать имя изображения.

  • / соответствует литералу /
  • ([^/]+) соответствует одному или нескольким символам, которые не / - имя файла
  • \.jpg соответствует [ 1119] в конце ($)
0
ответ дан heemayl 27 February 2019 в 14:57
поделиться

Вы используете класс символов , который будет одним из перечисленных символов. Таким образом, ваш паттерн ([\w\s.-]).[jpg] будет захватывать группу, соответствующую одному из [\w\s.-], затем совпадать с любым символом, кроме новой строки из-за точки ., а затем совпадать с одним из [jpg].

Для ваших примеров данных, которые предоставят вам группу захвата для L и совпадение для og, а также группу захвата для 0, 1, 3 и совпадение для .j ]

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

/([^/]*[^/\d])\d*\.jpg

Regex demo | Python demo

Это будет соответствовать

  • / Соответствовать буквально
  • ( Группа захвата (будет содержать название бренда)
    • [^/]* Совпадение не / 0+ раз и не / с использованием отрицательных классов символов
    • [^/\d] Совпадение не является / или цифра
  • ) Закрыть группу
  • \d* Совпадение 0+ раз цифра
  • \.jpg Совпадение .jpg
  • [ 1138]
0
ответ дан The fourth bird 27 February 2019 в 14:57
поделиться

Отличным ресурсом для тестирования вашего регулярного выражения является Regex101 .

Вы пытаетесь сгруппировать файл, заканчивающийся вместе, используя квадратные скобки [], которые создают выбор из трех символов j, p или g. Точка не экранирована и, следовательно, в синтаксисе регулярных выражений - это любой символ. Поскольку вы никогда не добавляете множители (например, + для 1 или более символов, * для 0 или более символов или ? для необязательного символа), вы соответствуете всего нескольким буквам.

Если вы хотите прочитать немного больше обо всех операторах регулярных выражений, модификаторах и подобных понятиях, Я рекомендую прочитать документацию модуля re python .

Вы можете либо переписать регулярное выражение во что-то вроде этого (извлечь первую группу, чтобы получить имя файла), либо использовать тот факт, что в пакете os есть библиотека обработки пути:

^.*\/([^\/]+\.jpg).*$

Вы можете увидеть это регулярное выражение в действии здесь.

Поскольку у вас, похоже, уже есть доступные объекты пути, вы можете просто извлечь базовое имя пути, которое в вашем случае будет именем файла:

from os.path import basename
a = '/content/drive/My Drive/Logo/adidas10.jpg'
filename = basename(a)

[1111 ] теперь будет adidas10.jpg

0
ответ дан ingofreyer 27 February 2019 в 14:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: