Подтвердить что ты не робот

Совпадение первого экземпляра поиска регулярных выражений Python

Я ищу первый экземпляр совпадения с двумя квадратными скобками с использованием регулярных выражений. В настоящее время я делаю

regex = re.compile("(?<=(\[\[)).*(?=\]\])")
r = regex.search(line)

который работает для строк типа

[[string]] 

возвращает string

но когда я пробую его по отдельной строке:

[[string]] ([[string2]], [[string3]])

Результат

string]] ([[string2]], [[string3

Что мне не хватает?

4b9b3361

Ответ 1

Коды Python *, +, ? и {n,m} по умолчанию жадные

Шаблоны, квантифицированные с помощью указанных выше квантификаторов, будут соответствовать по умолчанию. В вашем случае это означает первый набор скобок и последний. В Python вы можете сделать любой квантор не жадным (или "ленивым" ), добавив после него ?. В вашем случае это будет означать .*? в средней части вашего выражения.

Ответ 2

Я думаю, когда питон начинает читать вашу строку

"[[string]] ([[string2]], [[string3]])" 

слева направо, затем он пытается найти самую длинную строку в соответствии с вашим регулярным выражением, прежде чем искать остальную часть строки для большего количества совпадений. Результат будет равен 1:

"string]] ([[string2]], [[string3"

Я предполагаю, что вы не хотите сопоставлять]] или [[. В этом случае вы можете добиться этого эффекта, изменив ваше регулярное выражение на

"(?<=(\[\[))[^(\[\[)(\]\])]*(?=\]\])"

Если вы это сделаете, вы получите 3 матча, которые будут просто

"string", "string2", "string3" 

Btw, это было проверено на https://pythex.org/, что полезно для тестирования регулярных выражений для python:)