Path: blob/main/crates/polars-ops/src/chunked_array/strings/strip.rs
6939 views
use polars_core::prelude::arity::{broadcast_binary_elementwise, unary_elementwise};12use super::*;34fn strip_chars_binary<'a>(opt_s: Option<&'a str>, opt_pat: Option<&str>) -> Option<&'a str> {5match (opt_s, opt_pat) {6(Some(s), Some(pat)) => {7if pat.chars().count() == 1 {8Some(s.trim_matches(pat.chars().next().unwrap()))9} else {10Some(s.trim_matches(|c| pat.contains(c)))11}12},13(Some(s), _) => Some(s.trim()),14_ => None,15}16}1718fn strip_chars_start_binary<'a>(opt_s: Option<&'a str>, opt_pat: Option<&str>) -> Option<&'a str> {19match (opt_s, opt_pat) {20(Some(s), Some(pat)) => {21if pat.chars().count() == 1 {22Some(s.trim_start_matches(pat.chars().next().unwrap()))23} else {24Some(s.trim_start_matches(|c| pat.contains(c)))25}26},27(Some(s), _) => Some(s.trim_start()),28_ => None,29}30}3132fn strip_chars_end_binary<'a>(opt_s: Option<&'a str>, opt_pat: Option<&str>) -> Option<&'a str> {33match (opt_s, opt_pat) {34(Some(s), Some(pat)) => {35if pat.chars().count() == 1 {36Some(s.trim_end_matches(pat.chars().next().unwrap()))37} else {38Some(s.trim_end_matches(|c| pat.contains(c)))39}40},41(Some(s), _) => Some(s.trim_end()),42_ => None,43}44}4546fn strip_prefix_binary<'a>(s: Option<&'a str>, prefix: Option<&str>) -> Option<&'a str> {47Some(s?.strip_prefix(prefix?).unwrap_or(s?))48}4950fn strip_suffix_binary<'a>(s: Option<&'a str>, suffix: Option<&str>) -> Option<&'a str> {51Some(s?.strip_suffix(suffix?).unwrap_or(s?))52}5354pub fn strip_chars(ca: &StringChunked, pat: &StringChunked) -> StringChunked {55match pat.len() {561 => {57if let Some(pat) = pat.get(0) {58if pat.chars().count() == 1 {59// Fast path for when a single character is passed60unary_elementwise(ca, |opt_s| {61opt_s.map(|s| s.trim_matches(pat.chars().next().unwrap()))62})63} else {64unary_elementwise(ca, |opt_s| {65opt_s.map(|s| s.trim_matches(|c| pat.contains(c)))66})67}68} else {69unary_elementwise(ca, |opt_s| opt_s.map(|s| s.trim()))70}71},72_ => broadcast_binary_elementwise(ca, pat, strip_chars_binary),73}74}7576pub fn strip_chars_start(ca: &StringChunked, pat: &StringChunked) -> StringChunked {77match pat.len() {781 => {79if let Some(pat) = pat.get(0) {80if pat.chars().count() == 1 {81// Fast path for when a single character is passed82unary_elementwise(ca, |opt_s| {83opt_s.map(|s| s.trim_start_matches(pat.chars().next().unwrap()))84})85} else {86unary_elementwise(ca, |opt_s| {87opt_s.map(|s| s.trim_start_matches(|c| pat.contains(c)))88})89}90} else {91unary_elementwise(ca, |opt_s| opt_s.map(|s| s.trim_start()))92}93},94_ => broadcast_binary_elementwise(ca, pat, strip_chars_start_binary),95}96}9798pub fn strip_chars_end(ca: &StringChunked, pat: &StringChunked) -> StringChunked {99match pat.len() {1001 => {101if let Some(pat) = pat.get(0) {102if pat.chars().count() == 1 {103// Fast path for when a single character is passed104unary_elementwise(ca, |opt_s| {105opt_s.map(|s| s.trim_end_matches(pat.chars().next().unwrap()))106})107} else {108unary_elementwise(ca, |opt_s| {109opt_s.map(|s| s.trim_end_matches(|c| pat.contains(c)))110})111}112} else {113unary_elementwise(ca, |opt_s| opt_s.map(|s| s.trim_end()))114}115},116_ => broadcast_binary_elementwise(ca, pat, strip_chars_end_binary),117}118}119120pub fn strip_prefix(ca: &StringChunked, prefix: &StringChunked) -> StringChunked {121match prefix.len() {1221 => match prefix.get(0) {123Some(prefix) => unary_elementwise(ca, |opt_s| {124opt_s.map(|s| s.strip_prefix(prefix).unwrap_or(s))125}),126_ => StringChunked::full_null(ca.name().clone(), ca.len()),127},128_ => broadcast_binary_elementwise(ca, prefix, strip_prefix_binary),129}130}131132pub fn strip_suffix(ca: &StringChunked, suffix: &StringChunked) -> StringChunked {133match suffix.len() {1341 => match suffix.get(0) {135Some(suffix) => unary_elementwise(ca, |opt_s| {136opt_s.map(|s| s.strip_suffix(suffix).unwrap_or(s))137}),138_ => StringChunked::full_null(ca.name().clone(), ca.len()),139},140_ => broadcast_binary_elementwise(ca, suffix, strip_suffix_binary),141}142}143144145