def _parse_fields_string(self, field_names):
        """
        Convert raw string or list of names to actual column names:
        - names starting with '-' indicate to suppress that field
        - '*' means include all other field names
        - if no fields are specifically included, then all fields are used
        :param field_names: str or list
        :return: expanded list of field names
        """
        if isinstance(field_names, basestring):
            field_names = field_names.split()
        if not self.obs:
            return field_names

        suppress_names = [nm[1:] for nm in field_names if nm.startswith('-')]
        field_names = [nm for nm in field_names if not nm.startswith('-')]
        if not field_names:
            field_names = ['*']
        if '*' in field_names:
            star_fields = [name for name in _object_attrnames(self[0]) if name not in field_names]
            fn_iter = iter(field_names)
            field_names = list(takewhile(lambda x: x != '*', fn_iter)) + star_fields + list(fn_iter)
        field_names = [nm for nm in field_names if nm not in suppress_names]
        return field_names
Convert raw string or list of names to actual column names:
        - names starting with '-' indicate to suppress that field
        - '*' means include all other field names
        - if no fields are specifically included, then all fields are used
        :param field_names: str or list
        :return: expanded list of field names