1 # module 'string' -- A collection of string operations
3 # Warning: most of the code you see here isn't normally used nowadays.
4 # At the end of this file most functions are replaced by built-in
5 # functions imported from built-in module "strop".
7 # Some strings for ctype-style character classification
8 whitespace
= ' \t\n\r\v\f'
9 lowercase
= 'abcdefghijklmnopqrstuvwxyz'
10 uppercase
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
11 letters
= lowercase
+ uppercase
13 hexdigits
= digits
+ 'abcdef' + 'ABCDEF'
14 octdigits
= '01234567'
16 # Case conversion helpers
18 for i
in range(256): _idmap
= _idmap
+ chr(i
)
19 _lower
= _idmap
[:ord('A')] + lowercase
+ _idmap
[ord('Z')+1:]
20 _upper
= _idmap
[:ord('a')] + uppercase
+ _idmap
[ord('z')+1:]
21 _swapcase
= _upper
[:ord('A')] + lowercase
+ _upper
[ord('Z')+1:]
24 # Backward compatible names for exceptions
25 index_error
= ValueError
26 atoi_error
= ValueError
27 atof_error
= ValueError
28 atol_error
= ValueError
30 # convert UPPER CASE letters to lower case
34 res
= res
+ _lower
[ord(c
)]
37 # Convert lower case letters to UPPER CASE
41 res
= res
+ _upper
[ord(c
)]
44 # Swap lower case letters and UPPER CASE
48 res
= res
+ _swapcase
[ord(c
)]
51 # Strip leading and trailing tabs and spaces
54 while i
< j
and s
[i
] in whitespace
: i
= i
+1
55 while i
< j
and s
[j
-1] in whitespace
: j
= j
-1
58 # Split a string into a list of space/tab-separated words
59 # NB: split(s) is NOT the same as splitfields(s, ' ')!
64 while i
< n
and s
[i
] in whitespace
: i
= i
+1
67 while j
< n
and s
[j
] not in whitespace
: j
= j
+1
72 # Split a list into fields separated by a given string
73 # NB: splitfields(s, ' ') is NOT the same as split(s)!
74 # splitfields(s, '') returns [s] (in analogy with split() in nawk)
75 def splitfields(s
, sep
):
83 if s
[j
:j
+nsep
] == sep
:
91 # Join words with spaces between them
93 return joinfields(words
, ' ')
95 # Join fields with separator
96 def joinfields(words
, sep
):
100 return res
[len(sep
):]
102 # Find substring, raise exception if not found
103 def index(s
, sub
, i
= 0):
104 res
= find(s
, sub
, i
)
106 raise ValueError, 'substring not found in string.index'
109 # Find last substring, raise exception if not found
110 def rindex(s
, sub
, i
= 0):
111 res
= rfind(s
, sub
, i
)
113 raise ValueError, 'substring not found in string.index'
116 # Count non-overlapping occurrences of substring
117 def count(s
, sub
, i
= 0):
118 if i
< 0: i
= max(0, i
+ len(s
))
121 if n
== 0: return m
-i
131 # Find substring, return -1 if not found
132 def find(s
, sub
, i
= 0):
133 if i
< 0: i
= max(0, i
+ len(s
))
137 if sub
== s
[i
:i
+n
]: return i
141 # Find last substring, return -1 if not found
142 def rfind(s
, sub
, i
= 0):
143 if i
< 0: i
= max(0, i
+ len(s
))
148 if sub
== s
[i
:i
+n
]: r
= i
152 # Convert string to float
157 if s
and s
[0] in '+-':
161 raise ValueError, 'non-float argument to string.atof'
162 while s
[0] == '0' and len(s
) > 1 and s
[1] in digits
: s
= s
[1:]
163 if regex
.match('[0-9]*\(\.[0-9]*\)?\([eE][-+]?[0-9]+\)?', s
) != len(s
):
164 raise ValueError, 'non-float argument to string.atof'
166 return float(eval(sign
+ s
))
168 raise ValueError, 'non-float argument to string.atof'
170 # Convert string to integer
171 def atoi(str, base
=10):
173 # We only get here if strop doesn't define atoi()
174 raise ValueError, "this string.atoi doesn't support base != 10"
177 if s
and s
[0] in '+-':
181 raise ValueError, 'non-integer argument to string.atoi'
182 while s
[0] == '0' and len(s
) > 1: s
= s
[1:]
185 raise ValueError, 'non-integer argument to string.atoi'
186 return eval(sign
+ s
)
188 # Convert string to long integer
189 def atol(str, base
=10):
191 # We only get here if strop doesn't define atol()
192 raise ValueError, "this string.atol doesn't support base != 10"
195 if s
and s
[0] in '+-':
199 raise ValueError, 'non-integer argument to string.atol'
200 while s
[0] == '0' and len(s
) > 1: s
= s
[1:]
203 raise ValueError, 'non-integer argument to string.atol'
204 return eval(sign
+ s
+ 'L')
206 # Left-justify a string
212 # Right-justify a string
219 def center(s
, width
):
224 # This ensures that center(center(s, i), j) = center(s, j)
226 return ' '*half
+ s
+ ' '*(n
-half
)
228 # Zero-fill a number, e.g., (12, 3) --> '012' and (-3, 3) --> '-03'
229 # Decadent feature: the argument may be a string or a number
230 # (Use of this is deprecated; it should be a string as with ljust c.s.)
232 if type(x
) == type(''): s
= x
235 if n
>= width
: return s
237 if s
[0] in ('-', '+'):
238 sign
, s
= s
[0], s
[1:]
239 return sign
+ '0'*(width
-n
) + s
241 # Expand tabs in a string.
242 # Doesn't take non-printing chars into account, but does understand \n.
243 def expandtabs(s
, tabsize
):
247 c
= ' '*(tabsize
- len(line
)%tabsize
)
255 # Try importing optional built-in module "strop" -- if it exists,
256 # it redefines some string operations that are 100-1000 times faster.
257 # It also defines values for whitespace, lowercase and uppercase
258 # that match <ctype.h>'s definitions.
262 letters
= lowercase
+ uppercase
264 pass # Use the original, slow versions