Отказ от ответственности: этот вопрос был переделан, поэтому комментарии и ответы могут показаться не связанными.Я извиняюсь, но я сделал это ради более ясного и лучше структурированного вопроса.
Предположим, задана строка, в которой я хочу найти две разные группы (имен), где одна группа A удовлетворяет условию1 и группа B удовлетворяет условию 2, но также и условию 1.
Для примера: скажем, у меня есть математическая функция -
'[class.parameterA] * numpy.exp( [x]*module.constantA - constant_B/[x] ) + [parameter_B]'
- где я контролирую значения параметровно не для констант.Я хочу получить (используя re.findall()
) группу для констант и группу для параметров.
>>> group1
['numpy.exp', 'module.constantA', 'constant_B']
>>> group2
['class.parameterA', 'x', 'x', 'parameter_B']
Я знаю, что для этого конкретного случая я не должен соответствовать numpy.exp
, но дляради цели вопроса, я позволю ему быть совпадением.
Чтобы уточнить, этот вопрос направлен на то, чтобы искать представление "игнорировать сопоставление {sequence}" в регулярном выражении и знать, есть лиэто возможность подойти к проблеме "ТОЛЬКО условие 1", а не "удовлетворять условие 1, а НЕ условие 2", поэтому решение можно распространить на несколько условий. Пожалуйста, предоставьте частично абстрагирующий ответ (не одинэто слишком специфично для этого примера).
Через некоторое время, конечно, мне удалось найти частичное решение (см. bonus ) только для одной из групп, но любой другойочень приветствуются ясные из них:
c1 = r'\w+\.?\w*' # forces alphanumeric variable structure
# c1 = r'[\w\.\(\)]*?' allows more freedom (can introduce function calls)
# at the cost of matching invalid names, like class..parameterA
c2 = r'(?<=\[)', r'(?=\])'
re_group2 = c2[0] + c1 + c2[1]
>>>> re.findall(re_group2, func)
['class.parameterA', 'x', 'x', 'parameter_B']
Очевидно, что интуитивно понятное отрицание скобок не работает для group1
, но я могу неправильно его ввести:
c1 = r'\w+\.?\w*'
nc2 = r'(?<!\[\w)', r'(?!\w\])' # condition 2 negation approach
re_group1 = nc2[0] + c1 + nc2[1]
>>> re.findall(re_group1, func)
['class.parameterA', 'numpy.exp', 'x', 'module.constantA',
'constant_B', 'x', 'parameter_B']
Бонус : если бы, скажем, было module.submodule.constantA
(более 1 точки), как бы изменилось регулярное выражение?Я предположил c1 = r'\w+(\.\w+)*'
, но это не так, как я ожидал.Изменить: мне нужно использовать группу без захвата, так как я использую re.findall
.Итак c1 = r'\w+(?:\.\w+)*'
.