{"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,\n        case: bool = True,\n        flags: int = 0,\n        na: Scalar | lib.NoDefault = lib.no_default,\n    ):\n        if pat.startswith(\"^\"):\n            pat = pat[1:]\n        pat = f\"^({pat})\"","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/_arrow_string_mixins.py#L389-L425","documentation":"Series.str.contains on the pyarrow backend only supports flags=0 because pyarrow's match_substring_regex has no analogue of Python re flags. Passing any non-zero flags raises NotImplementedError rather than silently ignoring the flags.","triggerScenarios":"s.str.contains(pat, flags=re.IGNORECASE) (or any non-zero flags value) on a string[pyarrow] Series.","commonSituations":"Reusing object-dtype code that uses re.IGNORECASE; wanting case-insensitive substring matching on arrow strings.","solutions":["For case-insensitivity use case=False instead of flags=re.IGNORECASE (the backend maps it to ignore_case=True).","For other flags, cast to object: s.astype(object).str.contains(pat, flags=...)."],"exampleFix":"// before\ns.str.contains(\"abc\", flags=re.IGNORECASE)\n// after\ns.str.contains(\"abc\", case=False)","handlingStrategy":"fallback","validationCode":"def safe_contains(s, pat, case=True, flags=0, regex=True):\n    if flags and \"string[pyarrow]\" in str(s.dtype):\n        if flags == re.IGNORECASE:\n            return s.str.contains(pat, case=False, regex=regex)\n        s = s.astype(object)\n    return s.str.contains(pat, case=case, flags=flags, regex=regex)","typeGuard":null,"tryCatchPattern":"try:\n    res = s.str.contains(pat, flags=flags)\nexcept NotImplementedError:\n    res = s.astype(object).str.contains(pat, flags=flags)","preventionTips":["Prefer case=False over flags=re.IGNORECASE on arrow strings","Cast to object dtype for non-IGNORECASE flags"],"tags":["pyarrow","string","regex","not-implemented","compatibility"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}