User:Milanand/Python 3 Programming/Strings
Overview
[edit | edit source]Strings in Python at a glance:
str1 = "Hello, " # A new string using double quotes
str2 = 'Hello, ' # Single quotes do the same
str3 = 'Hello,\tWorld!\n' # One with a tab and a newline
str4 = str1 + 'World!' # Concatenation
str5 = str1 + str(4) # Concatenation with a number
str6 = str1[2] # 3rd character
str6a = str1[-1] # Last character
#str1[0] = 'M' # No way; strings are immutable
for char in str1: print(char) # For each character
str7 = str1[1:] # Without the 1st character
str8 = str1[:-1] # Without the last character
str9 = str1[1:4] # Substring: 2nd to 4th character
str10 = str1 * 3 # Repetition
str11 = str1.lower() # Lowercase
str12 = str1.upper() # Uppercase
str13 = str1.rstrip() # Strip right (trailing) whitespace
str14 = str1.replace('l','h') # Replacement
list15 = str1.split('l') # Splitting
if str1 == str2: print('Equ') # Equality test
if 'el' in str1: print('In') # Substring test
length = len(str1) # Length
pos1 = str1.find('llo') # Index of substring or -1
pos2 = str1.rfind('l') # Index of substring, from the right
count = str1.count('l') # Number of occurrences of a substring
print(str1, str2, str3, str4, str5, str6, str7, str8, str9, str10)
print(str11, str12, str13, str14, list15)
print(length, pos1, pos2, count)
String Operations
[edit | edit source]Equality
[edit | edit source]Two strings are equal if they have exactly the same contents, meaning that they are both the same length and each character has a one-to-one positional correspondence. Many other languages compare strings by identity instead; that is, two strings are considered equal only if they occupy the same space in memory. Python uses the is
operator to test the identity of strings and any two objects in general.
Examples:
a = 'hello'; b = 'hello' # Assign 'hello to a and b'
a == b # Check for equality; True
a == 'hello' # True
a == "hello" # choice of delimiter is unimportant; True
a == 'hello ' # trailing whitespace; True
a == 'Hello' # case matters; True
Numerical
[edit | edit source]There are two quasi-numerical operations which can be done on strings – addition and multiplication. String addition is just another name for concatenation. String multiplication is repetitive addition, or concatenation. So:
c = 'a'
c + 'b' # 'ab'
c * 5 # 'aaaaa'
Containment
[edit | edit source]
There is a simple operator in
that returns True if the first operand is contained in the second. This also works on substrings:
x = 'hello'
y = 'hell'
x in y # False
y in x # True
Note that print(x in y)
would have also returned the same value.
Indexing and Slicing
[edit | edit source]
Much like arrays in other languages, the individual characters in a string can be accessed by an integer representing its position in the string. The first character in string s
would be s[0]
and the nth character would be at s[n-1]
.
s = 'Xanadu'
s[1] # 'a'
Unlike arrays in other languages, Python also indexes the arrays backwards, using negative numbers. The last character has index -1, the second to last character has index -2, and so on.
s[-4] # 'n'
We can also use "slices" to access a substring of s
. s[a:b]
will give us a string starting with s[a]
and ending with s[b-1
.
s[1:4] # 'ana'
None of these are assignable.
print(s) # Xanadu
s[0] = 'J' # TypeError: 'str' object does not support item assignment
s[1:3] = 'up' # TypeError: 'str' object does not support item assignment
print(s) # Xanadu
Another feature of slices is that if the beginning or end is left empty, it will default to the first or last index, depending on context:
s[2:] # 'nadu'
s[:3] # 'Xan'
s[:] # 'Xanadu'
You can also use negative numbers in slices:
print(s[-2:]) # 'du'
Element: 1 2 3 4 Index: 0 1 2 3 4 -4 -3 -2 -1
So, when we ask for the [1:3] slice, that means we start at index 1, and end at index 2, and take everything in between them. If you are used to indexes in C or Java, this can be a bit disconcerting until you get used to it.
String constants
[edit | edit source]String constants can be found in the standard string module. An example is string.digits
, which equals to '0123456789'
.
Links for further reference:
String methods
[edit | edit source]There are a number of methods or built-in string functions:
capitalize()
center()
count()
decode()
encode()
endswith()
expandtabs()
find()
index()
isalnum()
isalpha()
isdigit()
islower()
isspace()
istitle()
isupper()
join()
ljust()
lower()
lstrip()
replace()
rfind()
rindex()
rjust()
rstrip()
split()
splitlines()
startswith()
strip()
swapcase()
title()
translate()
upper()
zfill()
Only emphasized items will be covered.
is*
[edit | edit source]isalnum()
, isalpha()
, isdigit()
, islower()
, isupper()
, isspace()
, and istitle()
fit into this category.
The length of the string object being compared must be at least 1, or the is* methods will return False. In other words, a string object of len(string) == 0
, is considered "empty", or False
.
isalnum()
returnsTrue
if the string is entirely composed of alphabetic and/or numeric characters (i.e. no punctuation).isalpha()
andisdigit()
work similarly for alphabetic characters or numeric characters only.isspace()
returnsTrue
if the string is composed entirely of whitespace.islower()
,isupper()
, andistitle()
returnTrue
if the string is in lowercase, uppercase, or titlecase respectively. Uncased characters are "allowed", such as digits, but there must be at least one cased character in the string object in order to returnTrue
. Titlecase means the first cased character of each word is uppercase, and any immediately following cased characters are lowercase. Curiously,'Y2K'.istitle()
returns True. That is because uppercase characters can only follow uncased characters. Likewise, lowercase characters can only follow uppercase or lowercase characters. Hint: whitespace is uncased.
Example:
'2YK'.istitle() # False
'Y2K'.istitle() # True
'2Y K'.istitle() # True
title, upper, lower, swapcase, capitalize
[edit | edit source]Returns the string converted to title case, upper case, lower case, inverts case, or capitalizes, respectively.
The title()
method capitalizes the first letter of each word in the string (and makes the rest lower case). Words are identified as substrings of alphabetic characters that are separated by non-alphabetic characters, such as digits, or whitespace. This can lead to some unexpected behavior. For example, the string 'x1x'
will be converted to 'X1X'
instead of 'X1x'
.
The swapcase()
method makes all uppercase letters lowercase and vice versa.
The capitalize()
method is like title except that it considers the entire string to be a word. (i.e. it makes the first character upper case and the rest lower case)
Example:
s = 'Hello, wOrLD!'
print(s) # 'Hello, wOrLD!'
print(s.title()) # 'Hello, World!'
print(s.swapcase()) # 'hELLO, WoRld!'
print(s.upper()) # 'HELLO, WORLD!'
print(s.lower()) # 'hello, world!'
print(s.capitalize()) # 'Hello, world!'
count
[edit | edit source]Returns the number of the specified substrings in the string. i.e.
s = 'Hello, World!'
s.count('o') # print the number of 'o's in 'Hello, World!'; 2
Hint: .count()
is case-sensitive, so this example will only count the number of lowercase letter 'o'
s. For example, if you ran:
s = 'HELLO, WORLD!'
s.count('o') # print the number of lowercase 'o's in 'HELLO, WORLD!'; 0
strip, rstrip, lstrip
[edit | edit source]
Returns a copy of the string with the leading (lstrip()
) and trailing (rstrip()
) whitespace removed. strip()
removes both.
s = '\t Hello, World!\n\t '
print(s) # Hello, World!
#
print(s.strip()) # Hello, World!
print(s.lstrip()) # Hello, World!
#
print(s.rstrip()) # Hello, World!
Note the leading and trailing tabs and newlines. Strip methods can also be used to remove other types of characters.
import string
s = 'www.wikibooks.org'
print(s) # www.wikibooks.org
print(s.strip('w')) # Removes all w's from outside; .wikibooks.org
print(s.strip(string.lowercase)) # Removes all lowercase letters from outside; .wikibooks.
print(s.strip(string.printable)) # Removes all printable characters
Note that string.lowercase
and string.printable
require an import string
statement
ljust, rjust, center
[edit | edit source]left, right or center justifies a string into a given field size (the rest is padded with spaces).
s = 'foo'
s # 'foo'
s.ljust(7) # 'foo '
s.rjust(7) # ' foo'
s.center(7) # ' foo '
join
[edit | edit source]Joins together the given sequence with the string as separator:
seq = ['1', '2', '3', '4', '5']
' '.join(seq) # '1 2 3 4 5'
'+'.join(seq) # '1+2+3+4+5'
map()
may be helpful here: (it converts numbers in seq
into strings)
seq = [1,2,3,4,5]
' '.join(map(str, seq)) # '1 2 3 4 5'
Now arbitrary objects may be in seq
instead of just strings.
find, index, rfind, rindex
[edit | edit source]
The find()
and index()
methods return the index of the first found occurrence of the given subsequence. If it is not found, find()
returns -1
but index()
raises a ValueError
. rfind()
and rindex()
are the same as find()
and index()
except that they search through the string from right to left (i.e. they find the last occurrence)
s = 'Hello, World!'
s.find('l') # 2
s[s.index('l'):] # 'llo, World!'
s.rfind('l') # 10
s[:s.rindex('l')] # 'Hello, Wor'
>>> s[s.index('l'):s.rindex('l')] # 'llo, Wor'
Because Python strings accept negative subscripts, index is probably better used in situations like the one shown because using find instead would yield an unintended value.
replace
[edit | edit source]replace()
works just like it sounds. It returns a copy of the string with all occurrences of the first parameter replaced with the second parameter.
'Hello, World!'.replace('o', 'X') # 'HellX, WXrld!'
Or, using variable assignment:
string = 'Hello, World!'
newString = string.replace('o', 'X')
print(string) # Hello, World!
print(newString) # HellX, WXrld!
Notice, the original variable (string
) remains unchanged after the call to replace()
.
expandtabs
[edit | edit source]Replaces tabs with the appropriate number of spaces (default number of spaces per tab = 8; this can be changed by passing the tab size as an argument).
s = 'abcdefg\tabc\ta'
print(s) # abcdefg abc a
print(len(s)) # 13
t = s.expandtabs()
print(t) # abcdefg abc a
print(len(t)) # 17
Notice how (although these both look the same) the second string (t) has a different length because each tab is represented by spaces not tab characters. To use a tab size of 4 instead of 8:
v = s.expandtabs(4)
print(v) # abcdefg abc a
print(len(v)) # 13
Please note each tab is not always counted as eight spaces. Rather a tab "pushes" the count to the next multiple of eight. For example:
s = '\t\t'
print(s.expandtabs().replace(' ', '*')) # ****************
print(len(s.expandtabs())) # 16
s = 'abc\tabc\tabc'
print(s.expandtabs().replace(' ', '*')) # abc*****abc*****abc
print(len(s.expandtabs())) # 19
split, splitlines
[edit | edit source]
The split()
method returns a list of the words in the string. It can take a separator argument to use instead of whitespace.
s = 'Hello, World!'
s.split() # ['Hello,', 'World!']
s.split('l') # ['He', '', 'o, Wor', 'd!']
Note that in neither case is the separator included in the split strings, but empty strings are allowed.
The splitlines()
method breaks a multiline string into many single line strings. It is analogous to split('\n')
(but accepts '\r'
and '\r\n'
as delimiters as well) except that if the string ends in a newline character, splitlines()
ignores that final character (see example).
s = """
... One line
... Two lines
... Red lines
... Blue lines
... Green lines
... """
s.split('\n') # ['', 'One line', 'Two lines', 'Red lines', 'Blue lines', 'Green lines', '']
s.splitlines() # ['', 'One line', 'Two lines', 'Red lines', 'Blue lines', 'Green lines']
The method split()
also accepts multi-character string literals:
txt = 'Space, the final frontier.'
spl = txt.split('the')
print(spl) # ['Space, ', ' final frontier.']