<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def separate(df, column, into, sep="[\W_]+", remove=True, convert=False, extra='drop', fill='right'):
 """ Splits columns into multiple columns. Args: df (pandas.DataFrame):
 DataFrame passed in through the pipe. column (str, symbolic):
 Label of column to split. into (list):
 List of string names for new columns. Kwargs: sep (str or list):
 If a string, the regex string used to split the column. If a list, a list of integer positions to split strings on. remove (bool):
 Boolean indicating whether to remove the original column. convert (bool):
 Boolean indicating whether the new columns should be converted to the appropriate type. extra (str):
 either `'drop'`, where split pieces beyond the specified new columns are dropped, or `'merge'`, where the final split piece contains the remainder of the original column. fill (str):
 either `'right'`, where `np.nan` values are filled in the right-most columns for missing pieces, or `'left'` where `np.nan` values are filled in the left-most columns. """


    assert isinstance(into, (tuple, list))

    if isinstance(sep, (tuple, list)):
        inds = [0] + list(sep)
        if len(inds) > len(into):
            if extra == 'drop':
                inds = inds[:len(into) + 1]
            elif extra == 'merge':
                inds = inds[:len(into)] + [None]
        else:
            inds = inds + [None]

        splits = df[column].map(lambda x: [str(x)[slice(inds[i], inds[i + 1])]
                                           if i < len(inds) - 1 else np.nan
                                           for i in range(len(into))])

    else:
        maxsplit = len(into) - 1 if extra == 'merge' else 0
        splits = df[column].map(lambda x: re.split(sep, x, maxsplit))

    right_filler = lambda x: x + [np.nan for i in range(len(into) - len(x))]
    left_filler = lambda x: [np.nan for i in range(len(into) - len(x))] + x

    if fill == 'right':
        splits = [right_filler(x) for x in splits]
    elif fill == 'left':
        splits = [left_filler(x) for x in splits]

    for i, split_col in enumerate(into):
        df[split_col] = [x[i] if not x[i] == '' else np.nan for x in splits]

    if convert:
        df = convert_type(df, into)

    if remove:
        df.drop(column, axis=1, inplace=True)

    return df