Skip to main content
Glama

extract_from_column

Extract specific patterns from CSV columns using regex capturing groups. Parse email addresses, product codes, names, dates, and other structured data into separate columns for analysis.

Instructions

Extract patterns from a column using regex with capturing groups.

Returns: ColumnOperationResult with extraction details

Examples: # Extract email parts extract_from_column(ctx, "email", r"(.+)@(.+)")

# Extract code components
extract_from_column(ctx, "product_code", r"([A-Z]{2})-(\d+)")

# Extract and expand into multiple columns
extract_from_column(ctx, "full_name", r"(\w+)\s+(\w+)", expand=True)

# Extract year from date string
extract_from_column(ctx, "date", r"\d{4}")

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
columnYesColumn name to extract patterns from
patternYesRegex pattern with capturing groups to extract
expandYesWhether to expand multiple groups into separate columns

Implementation Reference

  • The main async handler function implementing the 'extract_from_column' tool. It validates the regex pattern, extracts matches from the specified column using pandas str.extract, optionally expands capturing groups into new columns, and returns a ColumnOperationResult.
    async def extract_from_column(
        ctx: Annotated[Context, Field(description="FastMCP context for session access")],
        column: Annotated[str, Field(description="Column name to extract patterns from")],
        pattern: Annotated[str, Field(description="Regex pattern with capturing groups to extract")],
        *,
        expand: Annotated[
            bool,
            Field(description="Whether to expand multiple groups into separate columns"),
        ] = False,
    ) -> ColumnOperationResult:
        r"""Extract patterns from a column using regex with capturing groups.
    
        Returns:
            ColumnOperationResult with extraction details
    
        Examples:
            # Extract email parts
            extract_from_column(ctx, "email", r"(.+)@(.+)")
    
            # Extract code components
            extract_from_column(ctx, "product_code", r"([A-Z]{2})-(\d+)")
    
            # Extract and expand into multiple columns
            extract_from_column(ctx, "full_name", r"(\w+)\s+(\w+)", expand=True)
    
            # Extract year from date string
            extract_from_column(ctx, "date", r"\d{4}")
    
        """
        # Get session_id from FastMCP context
        session_id = ctx.session_id
        _session, df = get_session_data(session_id)
    
        _validate_column_exists(column, df)
    
        # Validate regex pattern
        try:
            re.compile(pattern)
        except re.error as e:
            msg = "pattern"
            raise InvalidParameterError(msg, pattern, f"Invalid regex pattern: {e}") from e
    
        # Apply extraction
        # pandas typing limitation: str.extract(expand=bool) overload not properly typed in pandas-stubs
        # See: https://github.com/pandas-dev/pandas-stubs/issues/43
        extracted = df[column].astype(str).str.extract(pattern, expand=expand)  # type: ignore[call-overload]
    
        if expand and isinstance(extracted, pd.DataFrame):
            # Multiple capturing groups - create new columns
            columns_created = []
            for i in range(len(extracted.columns)):
                new_col_name = f"{column}_extracted_{i}"
                df[new_col_name] = extracted.iloc[:, i]
                columns_created.append(new_col_name)
    
            affected_columns = columns_created
            operation_desc = f"extract_expand_{len(columns_created)}_groups"
        else:
            # Single group or no expand - replace original column
            if isinstance(extracted, pd.DataFrame):
                # Multiple groups but not expanding - take first group
                df[column] = extracted.iloc[:, 0]
            else:
                # Single series result
                df[column] = extracted
    
            affected_columns = [column]
            operation_desc = "extract_pattern"
    
        # Count successful extractions (non-null results)
        if expand and isinstance(extracted, pd.DataFrame):
            successful_extractions = int((~extracted.isna()).any(axis=1).sum())
        else:
            successful_extractions = (
                int(extracted.notna().sum()) if hasattr(extracted, "notna") else len(extracted)
            )
    
        return ColumnOperationResult(
            operation=operation_desc,
            rows_affected=successful_extractions,
            columns_affected=affected_columns,
        )
  • Registers the extract_from_column handler as a FastMCP tool named 'extract_from_column' on the column_text_server instance.
    column_text_server.tool(name="extract_from_column")(extract_from_column)
  • Pydantic schema definitions for tool parameters via Annotated types and Field descriptions.
    async def extract_from_column(
        ctx: Annotated[Context, Field(description="FastMCP context for session access")],
        column: Annotated[str, Field(description="Column name to extract patterns from")],
        pattern: Annotated[str, Field(description="Regex pattern with capturing groups to extract")],
        *,
        expand: Annotated[
            bool,
            Field(description="Whether to expand multiple groups into separate columns"),
        ] = False,
    ) -> ColumnOperationResult:

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jonpspri/databeak'

If you have feedback or need assistance with the MCP directory API, please join our Discord server