Регулярное выражение для извлечения текста между квадратными скобками

Я просто использовал микс python для реализации модульного тестирования для python milters. Как правило, milter разговаривает с MTA, что затрудняет тестирование модулей. Контрольный mixin переопределяет методы, которые говорят с MTA, и создайте имитированную среду, управляемую тестовыми примерами.

Итак, вы берете немодифицированное приложение milter, такое как spfmilter и mixin TestBase, например:

class TestMilter(TestBase,spfmilter.spfMilter):
  def __init__(self):
    TestBase.__init__(self)
    spfmilter.config = spfmilter.Config()
    spfmilter.config.access_file = 'test/access.db'
    spfmilter.spfMilter.__init__(self)

Затем используйте TestMilter в тестовых примерах для приложения milter:

def testPass(self):
  milter = TestMilter()
  rc = milter.connect('mail.example.com',ip='192.0.2.1')
  self.assertEqual(rc,Milter.CONTINUE)
  rc = milter.feedMsg('test1',sender='good@example.com')
  self.assertEqual(rc,Milter.CONTINUE)
  milter.close()

http://pymilter.cvs.sourceforge.net/viewvc/pymilter/ pymilter / Milter / test.py редакция = 1.6 & амп;? = вид разметки

356
задан ObiWanKenobi 8 March 2010 в 07:20
поделиться

5 ответов

Вы можете использовать следующий regex глобально:

\[(.*?)\]

Объяснение:

  • \[ : [ является метасимволом и должен быть экранирован, если вы хотите сопоставить его буквально.
  • (.*?) : соответствует всему не жадному способу и захватывает его.
  • \] : ] является мета-символом и должен быть экранирован, если вы хотите подобрать его буквально.
676
ответ дан 23 November 2019 в 00:21
поделиться

, если Вы хотите фильтр только маленькая буква алфавита между квадратной скобкой a-z

(\[[a-z]*\])

, если Вы хотите маленький и ограничения letter a-zA-Z

(\[[a-zA-Z]*\]) 

, если Вы хотите маленькие заглавные буквы и номер letter a-zA-Z0-9

(\[[a-zA-Z0-9]*\]) 

, если Вы хотите все между квадратной скобкой

, если Вы хотите текст, число и символы

(\[.*\])
2
ответ дан 23 November 2019 в 00:21
поделиться

На всякий случай Вы, возможно, имели незакрытые скобки , можно, вероятно, разработать некоторое выражение с рекурсией, подобной,

\[(([^\]\[]+)|(?R))*+\]

, который, конечно, это коснулось бы языка или механизма RegEx, который Вы могли бы использовать.

Демонстрация RegEx 1

<час>

Кроме этого,

\[([^\]\[\r\n]*)\]

Демонстрация RegEx 2

или,

(?<=\[)[^\]\[\r\n]*(?=\])

Демонстрация RegEx 3

хорошие варианты исследовать.

<час>

, Если Вы хотите упростить/изменить/исследовать выражение, оно было объяснено на верхней правой панели regex101.com . Если бы Вы хотели бы, можно также смотреть в эта ссылка , как она соответствовала бы против некоторых демонстрационных исходных данных.

<час>

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

Тест

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Источник

Регулярное выражение для соответствия сбалансированным круглым скобкам

0
ответ дан 23 November 2019 в 00:21
поделиться

Могут ли скобки быть вложенными?

Если нет: \[([^]]+)\] соответствует одному элементу, включая квадратные скобки. Обратная ссылка \1 будет содержать элемент, который нужно сопоставить. Если ваш regex поддерживает lookaround, используйте

(?<=\[)[^]]+(?=\])

Это будет соответствовать только элементу внутри скобок.

32
ответ дан 23 November 2019 в 00:21
поделиться

Это должно работать нормально:

\[([^]]+)\]
84
ответ дан 23 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: