Ваш настоящий вопрос, насколько я понимаю, получить эти конкретные числа, кроме тех, которые указаны в скобках.
Для этого я предлагаю использовать шаблон skip_what_to_avoid|what_i_want
, например:
(\((?>[^()\\]++|\\.|(?1))*+\))
|\b(2)(?=\b(?:,|\(|'|$))
Идея здесь в том, чтобы полностью игнорировать общие совпадения (и там первая группа использует рекурсивный шаблон для захвата всего, что находится в скобках: (\((?>[^()\\]++|\\.|(?1))*+\))
): это мусорное ведро.Вместо этого нам нужно только проверить группу захвата $ 2, которая, когда установлена, содержит звездочки вне комментариев.
Демо
Пример кода:
import regex as re
regex = r"(\((?>[^()\\]++|\\.|(?1))*+\))|\b(2)(?=\b(?:,|\(|'|$))"
test_str = "2(2'Abf',3),212,2'abc',2(1,2'abd',3)"
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches):
matchNum = matchNum + 1
if match.groups()[1] is not None:
print ("Found at {start}-{end}: {group}".format(start = match.start(2), end = match.end(2), group = match.group(2)))
Вывод:
Found at 0-1: 2
Found at 16-17: 2
Found at 23-24: 2
Для этого решения требуется альтернативный пакет Python regex .