code: def _parse_fields_string(self, 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
docs: 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