Я хотел бы создать регулярное выражение, которое может mmatch символов [].\,();~-
, которые не заключены в двойные кавычки.
Например, эта строка:
do Output.printString("Test 1: expected result: 5; actual result: ");
должны возвращать совпадения:
['.', '(', ')', ';']
Я пробовал использовать отрицательный lookahead и негативный lookbehind безрезультатно.
Вы можете использовать это регулярное выражение так, чтобы он соответствовал символу за пределами пары двойных кавычек:
>>> s = 'do Output.printString("Test 1: expected result: 5; actual result: ");'
>>> print re.findall(r'[][.,();~-](?=(?:(?:[^"]*"){2})*[^"]*$)', s)
['.', '(', ')', ';']
(?:[^"]*"){2}
находит пару котировок(?:(?:[^"]*"){2})*
находит 0 или более таких пар[^"]*$
гарантирует, что у нас больше нет кавычек после последней согласованной цитатыВам нужно два шага, поскольку регулярные выражения Python недостаточно мощны, чтобы сделать это за один раз.
re.findall(r'[\[\].\\,();~-]', re.sub(r'"(?:\\.|[^"\\])*"', '', s))
# => ['.', '(', ')', ';']
Внутренний re.sub
удаляет все строки с двойными кавычками (без re.sub
двойных кавычек); то вы можете использовать re.findall
чтобы легко подобрать то, что вы хотите.
Мы могли бы сделать что-то вроде:
Удалить текст внутри двойных кавычек
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 ['.', '(', ')', ';']
do Output.printString("Test 1: expected result: 5; \"(actual)\" result: ");
?