Кажется, что проблема с 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
, который соответствует границам слов и не работает для символов Юникода, мы используем группу, не связанную с захватом, которая соответствует началу строки ИЛИ пробела.
([\w\s.-])
(любой из [A-Za-z0-9_]
, пробелы, литерал .
, литерал -
) захватывает L
в Logo
, потому что это следует:
o
в данном случае [jpg]
: любой из j
, p
, g
; g
здесь Вам нужно:
/([^/]+)\.jpg$
Теперь единственная захваченная группа будет содержать имя изображения.
/
соответствует литералу /
([^/]+)
соответствует одному или нескольким символам, которые не /
- имя файла \.jpg
соответствует [ 1119] в конце ($
) Вы используете класс символов , который будет одним из перечисленных символов. Таким образом, ваш паттерн ([\w\s.-]).[jpg]
будет захватывать группу, соответствующую одному из [\w\s.-]
, затем совпадать с любым символом, кроме новой строки из-за точки .
, а затем совпадать с одним из [jpg]
.
Для ваших примеров данных, которые предоставят вам группу захвата для L
и совпадение для og
, а также группу захвата для 0
, 1
, 3
и совпадение для .j
]
Если вы хотите получить название бренда, например adidas , из ваших примеров, как вы указали в своем вопросе, вы можете использовать группу захвата.
/([^/]*[^/\d])\d*\.jpg
Это будет соответствовать
/
Соответствовать буквально (
Группа захвата (будет содержать название бренда) [^/]*
Совпадение не /
0+ раз и не /
с использованием отрицательных классов символов [^/\d]
Совпадение не является /
или цифра )
Закрыть группу \d*
Совпадение 0+ раз цифра \.jpg
Совпадение .jpg Отличным ресурсом для тестирования вашего регулярного выражения является 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