Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-ops/src/chunked_array/strings/strip.rs
6939 views
1
use polars_core::prelude::arity::{broadcast_binary_elementwise, unary_elementwise};
2
3
use super::*;
4
5
fn strip_chars_binary<'a>(opt_s: Option<&'a str>, opt_pat: Option<&str>) -> Option<&'a str> {
6
match (opt_s, opt_pat) {
7
(Some(s), Some(pat)) => {
8
if pat.chars().count() == 1 {
9
Some(s.trim_matches(pat.chars().next().unwrap()))
10
} else {
11
Some(s.trim_matches(|c| pat.contains(c)))
12
}
13
},
14
(Some(s), _) => Some(s.trim()),
15
_ => None,
16
}
17
}
18
19
fn strip_chars_start_binary<'a>(opt_s: Option<&'a str>, opt_pat: Option<&str>) -> Option<&'a str> {
20
match (opt_s, opt_pat) {
21
(Some(s), Some(pat)) => {
22
if pat.chars().count() == 1 {
23
Some(s.trim_start_matches(pat.chars().next().unwrap()))
24
} else {
25
Some(s.trim_start_matches(|c| pat.contains(c)))
26
}
27
},
28
(Some(s), _) => Some(s.trim_start()),
29
_ => None,
30
}
31
}
32
33
fn strip_chars_end_binary<'a>(opt_s: Option<&'a str>, opt_pat: Option<&str>) -> Option<&'a str> {
34
match (opt_s, opt_pat) {
35
(Some(s), Some(pat)) => {
36
if pat.chars().count() == 1 {
37
Some(s.trim_end_matches(pat.chars().next().unwrap()))
38
} else {
39
Some(s.trim_end_matches(|c| pat.contains(c)))
40
}
41
},
42
(Some(s), _) => Some(s.trim_end()),
43
_ => None,
44
}
45
}
46
47
fn strip_prefix_binary<'a>(s: Option<&'a str>, prefix: Option<&str>) -> Option<&'a str> {
48
Some(s?.strip_prefix(prefix?).unwrap_or(s?))
49
}
50
51
fn strip_suffix_binary<'a>(s: Option<&'a str>, suffix: Option<&str>) -> Option<&'a str> {
52
Some(s?.strip_suffix(suffix?).unwrap_or(s?))
53
}
54
55
pub fn strip_chars(ca: &StringChunked, pat: &StringChunked) -> StringChunked {
56
match pat.len() {
57
1 => {
58
if let Some(pat) = pat.get(0) {
59
if pat.chars().count() == 1 {
60
// Fast path for when a single character is passed
61
unary_elementwise(ca, |opt_s| {
62
opt_s.map(|s| s.trim_matches(pat.chars().next().unwrap()))
63
})
64
} else {
65
unary_elementwise(ca, |opt_s| {
66
opt_s.map(|s| s.trim_matches(|c| pat.contains(c)))
67
})
68
}
69
} else {
70
unary_elementwise(ca, |opt_s| opt_s.map(|s| s.trim()))
71
}
72
},
73
_ => broadcast_binary_elementwise(ca, pat, strip_chars_binary),
74
}
75
}
76
77
pub fn strip_chars_start(ca: &StringChunked, pat: &StringChunked) -> StringChunked {
78
match pat.len() {
79
1 => {
80
if let Some(pat) = pat.get(0) {
81
if pat.chars().count() == 1 {
82
// Fast path for when a single character is passed
83
unary_elementwise(ca, |opt_s| {
84
opt_s.map(|s| s.trim_start_matches(pat.chars().next().unwrap()))
85
})
86
} else {
87
unary_elementwise(ca, |opt_s| {
88
opt_s.map(|s| s.trim_start_matches(|c| pat.contains(c)))
89
})
90
}
91
} else {
92
unary_elementwise(ca, |opt_s| opt_s.map(|s| s.trim_start()))
93
}
94
},
95
_ => broadcast_binary_elementwise(ca, pat, strip_chars_start_binary),
96
}
97
}
98
99
pub fn strip_chars_end(ca: &StringChunked, pat: &StringChunked) -> StringChunked {
100
match pat.len() {
101
1 => {
102
if let Some(pat) = pat.get(0) {
103
if pat.chars().count() == 1 {
104
// Fast path for when a single character is passed
105
unary_elementwise(ca, |opt_s| {
106
opt_s.map(|s| s.trim_end_matches(pat.chars().next().unwrap()))
107
})
108
} else {
109
unary_elementwise(ca, |opt_s| {
110
opt_s.map(|s| s.trim_end_matches(|c| pat.contains(c)))
111
})
112
}
113
} else {
114
unary_elementwise(ca, |opt_s| opt_s.map(|s| s.trim_end()))
115
}
116
},
117
_ => broadcast_binary_elementwise(ca, pat, strip_chars_end_binary),
118
}
119
}
120
121
pub fn strip_prefix(ca: &StringChunked, prefix: &StringChunked) -> StringChunked {
122
match prefix.len() {
123
1 => match prefix.get(0) {
124
Some(prefix) => unary_elementwise(ca, |opt_s| {
125
opt_s.map(|s| s.strip_prefix(prefix).unwrap_or(s))
126
}),
127
_ => StringChunked::full_null(ca.name().clone(), ca.len()),
128
},
129
_ => broadcast_binary_elementwise(ca, prefix, strip_prefix_binary),
130
}
131
}
132
133
pub fn strip_suffix(ca: &StringChunked, suffix: &StringChunked) -> StringChunked {
134
match suffix.len() {
135
1 => match suffix.get(0) {
136
Some(suffix) => unary_elementwise(ca, |opt_s| {
137
opt_s.map(|s| s.strip_suffix(suffix).unwrap_or(s))
138
}),
139
_ => StringChunked::full_null(ca.name().clone(), ca.len()),
140
},
141
_ => broadcast_binary_elementwise(ca, suffix, strip_suffix_binary),
142
}
143
}
144
145