Совпадение первого экземпляра поиска регулярных выражений Python
Я ищу первый экземпляр совпадения с двумя квадратными скобками с использованием регулярных выражений. В настоящее время я делаю
regex = re.compile("(?<=(\[\[)).*(?=\]\])")
r = regex.search(line)
который работает для строк типа
[[string]]
возвращает string
но когда я пробую его по отдельной строке:
[[string]] ([[string2]], [[string3]])
Результат
string]] ([[string2]], [[string3
Что мне не хватает?
Ответы
Ответ 1
Коды Python *
, +
, ?
и {n,m}
по умолчанию жадные
Шаблоны, квантифицированные с помощью указанных выше квантификаторов, будут соответствовать по умолчанию. В вашем случае это означает первый набор скобок и последний. В Python вы можете сделать любой квантор не жадным (или "ленивым" ), добавив после него ?
. В вашем случае это будет означать .*?
в средней части вашего выражения.
Ответ 2
Я думаю, когда питон начинает читать вашу строку
"[[string]] ([[string2]], [[string3]])"
слева направо, затем он пытается найти самую длинную строку в соответствии с вашим регулярным выражением, прежде чем искать остальную часть строки для большего количества совпадений. Результат будет равен 1:
"string]] ([[string2]], [[string3"
Я предполагаю, что вы не хотите сопоставлять]] или [[. В этом случае вы можете добиться этого эффекта, изменив ваше регулярное выражение на
"(?<=(\[\[))[^(\[\[)(\]\])]*(?=\]\])"
Если вы это сделаете, вы получите 3 матча, которые будут просто
"string", "string2", "string3"
Btw, это было проверено на https://pythex.org/, что
полезно для тестирования регулярных выражений для python:)