# 'identifier', 'var3', 'NameCamelCase' IDENTIFIER_REGEX = r'[a-zA-Z_][a-zA-Z0-9_]*' # '[0]' GETITEM_REGEX = r'\[[0-9]+\]' # 'var' or 'var[0]' SUBEXPR_REGEX = r'%s(%s)*' % (IDENTIFIER_REGEX, GETITEM_REGEX) # 'inst', 'self.attr', 'self.attr[0]' RAW_EXPR_REGEX = r'%s((\.|->)%s)*' % (SUBEXPR_REGEX, SUBEXPR_REGEX) names = """ Py_TYPE Py_SIZE PyByteArray_GET_SIZE PyBytes_GET_SIZE PyCFunction_GET_CLASS PyCFunction_GET_FLAGS PyCFunction_GET_FUNCTION PyCFunction_GET_SELF PyCell_GET PyCode_GetNumFree PyDict_GET_SIZE PyFunction_GET_ANNOTATIONS PyFunction_GET_CLOSURE PyFunction_GET_CODE PyFunction_GET_DEFAULTS PyFunction_GET_GLOBALS PyFunction_GET_KW_DEFAULTS PyFunction_GET_MODULE PyHeapType_GET_MEMBERS PyInstanceMethod_GET_FUNCTION PyList_GET_SIZE PyMemoryView_GET_BASE PyMemoryView_GET_BUFFER PyMethod_GET_FUNCTION PyMethod_GET_SELF PySet_GET_SIZE PyTuple_GET_SIZE PyUnicode_GET_DATA_SIZE PyUnicode_GET_LENGTH PyUnicode_GET_LENGTH PyUnicode_GET_SIZE PyWeakref_GET_OBJECT PyByteArray_AS_STRING PyBytes_AS_STRING PyFloat_AS_DOUBLE PyUnicode_AS_DATA PyUnicode_AS_UNICODE PyUnicode_1BYTE_DATA PyUnicode_2BYTE_DATA PyUnicode_4BYTE_DATA PyUnicode_DATA PyUnicode_IS_ASCII PyUnicode_IS_COMPACT PyUnicode_IS_READY PyUnicode_KIND PyUnicode_READ PyUnicode_READ_CHAR PyDateTime_DATE_GET_FOLD PyDateTime_DATE_GET_HOUR PyDateTime_DATE_GET_MICROSECOND PyDateTime_DATE_GET_MINUTE PyDateTime_DATE_GET_SECOND PyDateTime_DATE_GET_TZINFO PyDateTime_DELTA_GET_DAYS PyDateTime_DELTA_GET_MICROSECONDS PyDateTime_DELTA_GET_SECONDS PyDateTime_GET_DAY PyDateTime_GET_MONTH PyDateTime_GET_YEAR PyDateTime_TIME_GET_FOLD PyDateTime_TIME_GET_HOUR PyDateTime_TIME_GET_MICROSECOND PyDateTime_TIME_GET_MINUTE PyDateTime_TIME_GET_SECOND PyDateTime_TIME_GET_TZINFO PyDescr_NAME PyDescr_TYPE """ expr_regex = r'[A-Za-z0_9]+' expr_regex = RAW_EXPR_REGEX names = names.strip().splitlines() regex = '(' + '|'.join(names) + ')' regex += r'\(' + expr_regex + r'\)' regex += r' *' regex += r'[^!<>=]' regex += r'=' regex += r'[^!<>=]' print(regex)