Обнаружение символов, которые не заключены в двойные кавычки (регулярное выражение)

1

Я хотел бы создать регулярное выражение, которое может mmatch символов [].\,();~-, которые не заключены в двойные кавычки.

Например, эта строка:

do Output.printString("Test 1: expected result: 5; actual result: ");

должны возвращать совпадения:

['.', '(', ')', ';']

Я пробовал использовать отрицательный lookahead и негативный lookbehind безрезультатно.

  • 0
    Что, если это экранированная строковая последовательность, например, do Output.printString("Test 1: expected result: 5; \"(actual)\" result: "); ?
  • 0
    Я не думаю, что это возможно только в регулярном выражении Python.
Показать ещё 7 комментариев
Теги:

3 ответа

2
Лучший ответ

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

>>> s = 'do Output.printString("Test 1: expected result: 5; actual result: ");'
>>> print re.findall(r'[][.,();~-](?=(?:(?:[^"]*"){2})*[^"]*$)', s)
['.', '(', ')', ';']

Демо-версия RegEx

  • Это регулярное выражение будет разделено на заданные специальные символы, если они находятся вне двойных кавычек, используя lookahead, чтобы удостовериться, что есть четное количество кавычек после согласованного символа.
  • (?:[^"]*"){2} находит пару котировок
  • (?:(?:[^"]*"){2})* находит 0 или более таких пар
  • [^"]*$ гарантирует, что у нас больше нет кавычек после последней согласованной цитаты
1

Вам нужно два шага, поскольку регулярные выражения Python недостаточно мощны, чтобы сделать это за один раз.

re.findall(r'[\[\].\\,();~-]', re.sub(r'"(?:\\.|[^"\\])*"', '', s))
# => ['.', '(', ')', ';']

Внутренний re.sub удаляет все строки с двойными кавычками (без re.sub двойных кавычек); то вы можете использовать re.findall чтобы легко подобрать то, что вы хотите.

  • 0
    Пожалуйста!
  • 0
    @marekful: Хаха, я был на полпути к моему ответу, когда ты прокомментировал, но уверен :)
Показать ещё 1 комментарий
1

Мы могли бы сделать что-то вроде:

Удалить текст внутри двойных кавычек

import re
pattern = u"[\"].*?[\"]"
text = 'do Output.printString("Test 1: expected result: 5; actual result: ");'
new_text = re.sub(ptrn, '', text)
# O/P 'do Output.printString();'

Сопоставьте все символы, которые вам нужны

pattern_2 = u"[\[\]\.\,\(\)\;\~\-]"
matches = re.findall(pattern2, new_text)

O/P ['.', '(', ')', ';']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню