{"record":{"id":"917dfccbd9f0edf5","repo":"pandas-dev/pandas","slug":"contains-not-implemented-with-flags","errorCode":null,"errorMessage":"contains not implemented with {flags=}","messagePattern":"contains not implemented with (.+?)","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/_arrow_string_mixins.py","lineNumber":407,"sourceCode":"\n    def _str_istitle(self):\n        result = pc.utf8_is_title(self._pa_array)\n        return self._convert_bool_result(result)\n\n    def _str_isupper(self):\n        result = pc.utf8_is_upper(self._pa_array)\n        return self._convert_bool_result(result)\n\n    def _str_contains(\n        self,\n        pat,\n        case: bool = True,\n        flags: int = 0,\n        na: Scalar | lib.NoDefault = lib.no_default,\n        regex: bool = True,\n    ):\n        if flags:\n            raise NotImplementedError(f\"contains not implemented with {flags=}\")\n\n        if regex:\n            pa_contains = pc.match_substring_regex\n        else:\n            pa_contains = pc.match_substring\n        result = pa_contains(self._pa_array, pat, ignore_case=not case)\n        return self._convert_bool_result(result, na=na, method_name=\"contains\")\n\n    def _str_match(\n        self,\n        pat: str | re.Pattern,\n        case: bool = True,\n        flags: int = 0,\n        na: Scalar | lib.NoDefault = lib.no_default,\n    ):\n        if isinstance(pat, re.Pattern):\n            # GH#63108 the accessor pre-compiles `pat` whenever the user passes\n            #  `flags`, so unwrap it here; pyarrow only supports IGNORECASE,","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/_arrow_string_mixins.py#L389-L425","documentation":"NotImplementedError raised in _str_contains of the ArrowStringArray mixin when the flags argument is non-zero. The pyarrow match_substring / match_substring_regex APIs only expose an ignore_case toggle, so general re flags (re.IGNORECASE, re.MULTILINE, etc.) cannot be forwarded.","triggerScenarios":"On a pyarrow-backed string Series: s.str.contains('x', flags=re.IGNORECASE); s.str.contains('^a', flags=re.M).","commonSituations":"Enabling pyarrow strings and reusing existing contains calls that passed re flags on object dtype; trying to do case-insensitive matching via flags instead of case=False.","solutions":["For case-insensitive matching use case=False (the supported pyarrow toggle): s.str.contains('x', case=False).","Embed the flag in the regex pattern itself, e.g. s.str.contains('(?i)x').","Cast to object dtype to keep using arbitrary flags: s.astype(object).str.contains('x', flags=re.IGNORECASE)."],"exampleFix":"# before (pa_series is dtype str[pyarrow])\npa_series.str.contains('x', flags=re.IGNORECASE)\n# after\npa_series.str.contains('x', case=False)","handlingStrategy":"validation","validationCode":"def safe_contains(s, pat, case=True, flags=0, **kw):\n    if flags and 'pyarrow' in str(s.dtype):\n        # fold common case-insensitive flag into case=False; otherwise cast\n        import re\n        if flags == re.IGNORECASE:\n            return s.str.contains(pat, case=False, **kw)\n        s = s.astype(object)\n    return s.str.contains(pat, case=case, flags=flags, **kw)","typeGuard":"def contains_needs_object(s, flags) -> bool:\n    return bool(flags) and 'pyarrow' in str(s.dtype)","tryCatchPattern":"try:\n    s.str.contains(pat, flags=flags)\nexcept NotImplementedError as e:\n    if 'contains not implemented' in str(e):\n        s.astype(object).str.contains(pat, flags=flags)\n    else:\n        raise","preventionTips":["For case-insensitive contains on pyarrow strings, use case=False instead of flags=re.IGNORECASE.","Embed flag semantics in the regex pattern (e.g. '(?i)') or cast to object dtype."],"tags":["strings","pyarrow","str-contains","regex"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}