2013-08-13 3 views
1

Я пытаюсь написать свой собственный синтаксический ярлык в возвышенном виде. Я думаю, что он использует регулярное выражение на основе python. Просто хочу, чтобы соответствовать все маркеры в строке как:RegEx только соответствует последнему элементу

описание str.bla, str.blub, str.yeah, str.no

Моя регулярное выражение выглядит следующим образом:

regex = "(description) (str\\.[\\w\\d]+)(,\\s*(str\\.[\\w\\d]+))*" 

Теперь я ожидайте 1 матч в группе 1 («описание»), 1 матч в группе 2 («str.bla») и 3 матча в моей группе № 4 («str.blub», «str.yeah», «str.no»)

, но у меня только 1 совпадение в моей последней группе ("str.no"). Что там происходит?

Большое спасибо!

+0

'/ g', которую вы ищете: http://stackoverflow.com/a/6052630/1057429 – alfasin

ответ

1

Если у вас есть повторяющаяся группа захвата, (например (a)* или (a)+, и т.д.), группа захвата будет содержать только последний матч.

Так что, если у меня есть регулярное выражение:

(123\d)+ 

И строка:

123412351236 

Вы увидите, что группа захвата будет содержать только 1236.

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

regex = "(description) (str\\.[\\w\\d]+)((?:,\\s*(?:str\\.[\\w\\d]+))*)" 

Который должен дать вам

['description', 'str.bla', ', str.blub, str.yeah, str.no'] 

Обратите внимание, как элементы сгруппированы; у вас есть 3 элемента в списке, последний из которых является «списком» в расширенном списке.

+0

Спасибо, это хороший обходной путь. По твоему пути:?: (= Не группа захвата) не реализовано в возвышенном –

+1

@JohnRumpel Хм, это означает, что вы будете получать несколько снимков, некоторые из которых не будут иметь значения. См. [Как это будет работать] (http://www.regex101.com/r/bS8tF9). – Jerry

0

Попробуйте это:

regex = "(description) (str\\.[\\w\\d]+)((?:,\\s*(?:str\\.[\\w\\d]+))*)"