2014-01-05 3 views
2

С регулярным выражением я хочу обнаружить текст/строку между начальными и конечными двойными фигурными фигурными скобками и обнаружить любые внутренние фигурные скобки вместе с текстом.регулярное выражение для обнаружения текста между двойными фигурными фигурными скобками

, например:

{{detect this {{and this as well}} text}} but text does not ends here so it should {{not detect this}}.

Я написал регулярное выражение

\{\{[\s\S]+\}\} 

но выбирает всю строку из {{опознает это .... TO {{не обнаружить это}}

Примечание: Я использую python re для это

+0

Вам нужно разобрать это, вы не можете Regex это ... – thefourtheye

+2

@thefourtheye Это не регулярный язык, но я не был бы удивлен, если это можно признать с 'ре '. Большинство вещей, называемых «регулярным выражением» в современном программировании, являются более мощными, чем конечные автоматы. Это то, что «желательно» - это еще один вопрос. – delnan

+1

Если у вас есть модуль [regex] (https://pypi.python.org/pypi/regex) из python 3.X, вы можете использовать [this] (http://regex101.com/r/qW0sI3). – Jerry

ответ

2

Pyparsing позволяет вам определять рекурсивные грамматики, но имеет встроенные помощники для таких общих типов. См аннотированный пример кода ниже:

from pyparsing import nestedExpr, ungroup, originalTextFor 

# use nestedExpr to define a default expression with left-right nesting markers 
nestedText = ungroup(nestedExpr('{{','}}')) 

sample = """{{detect this {{and this as well}} text}} but text does not ends here so it should {{not detect this}}.""" 

# note how reporting the results as a list keeps the nesting of {{ }}'s 
print nestedText.parseString(sample).asList() 
# prints ['detect', 'this', ['and', 'this', 'as', 'well'], 'text'] 

# if you just want the string itself, wrap with 'originalTextFor' 
print originalTextFor(nestedText).parseString(sample)[0] 
# prints {{detect this {{and this as well}} text}} 
0

Прежде всего {{[\s\S]+}} является (почти) так же, как {{.+}}. Причина: \s содержит все пробелы и \S содержит все, что не является пространством. Я бы вообще избегал классов символов верхнего регистра в [], это в основном приведет к путанице.

Во-вторых: Я думаю, что я на борту с ними, я не могу быстро подумать о RegEx, чтобы решить вашу проблему.

+1

Во многих вариантах регулярных выражений '.' не соответствует символам новой строки без специального флага (флаг, который недоступен на некоторых языках), поэтому' [\ s \ S] ', а также' [^] 'часто является обходным решением для этого , –

+0

Правда, но поскольку OP говорил об использовании python re, есть флаг для dotall, поэтому я бы предположил, что это «чище» для записи. + И активировать dotall, поскольку это более очевидно. – Malhelo

+0

Правда, на большинстве языков есть флаг «dotall», который действительно является более чистым решением, но иногда (в зависимости от варианта использования/регулярного выражения) вы можете захотеть, чтобы '.' не соответствовали символам новой строки или сохраняли перенос выражения в другом заданном язык. Я просто прокомментировал будущие стартеры, которые могут посетить тег 'regex'. –

Смежные вопросы