■ 定義字串
x = "abc" # 可用雙引號定義
x = 'abc' # 也可用單引號定義
x = """ # 可用三重引號跨行定義字串
abc
xyz
"""
■ 簡易字串操作
pi=3.14
str(pi)
"The value of pi is " + str(pi)
fox = "bHkloY"
fox.upper() #全部字元轉成大寫
fox.lower() #全部字元轉成小寫
fox.title() #首字轉成大寫
fox.capitalize #每個字詞的首字轉成大寫
fox.swapacase #將大小寫顛倒
line=" adf "
line.strip() #刪除前後的空格
line.rstrip() #刪除右邊的空格
line.lstrip() #刪除左邊的空格
num="00000345"
num.strip("0") #刪除特定字元
line = "this is the content"
line.center(30) #產生一定數量的空格,並中心對齊一個給定的字串
line.ljust(30) #產生一定長度的空格並左對齊
line.rjust(30) #產生一定長度的空格並右對齊
"345".rjust(10,"0") #能以任意字元填充空格
"345".zfill(10) #在左邊填充一定數量的0
line = 'the quick brown fox jumped over a lazy dog'
line.find('fox') #查詢子字串在字串中出現的索引,若搜尋不到子字串,會回傳-1
line.index('fox') #查詢子字串在字串中出現的索引,若搜尋不到子字串,會回傳ValueError
line.rfind('fox') #從尾部往前查詢子字串在字串中出現的索引
line.endswith('dog') #檢查字串尾部的子字串
linie.startswith('fox') #檢查字串頭部的子字串
line.replace('brown','red') #以第2個參數替換子字串
line.partition('fox')
#partition()會回傳3個tuple,分別是:目標子字串之前的子字串、目標子字串、目標子字串之後的子字串
line.rpartition('fox') #rpartition()從右向左搜尋字串
line.split() #split()預設以空白作為分割依據,回傳所有單字
haiku = """matsushima-ya
aah matsushima-ya
matsushima-ya"""
haiku.splitlines() #splitlines()對換行符號進行分割
'--'.join(['1', '2', '3']) #撤銷split()的結果,用分割依據再組成一個字串
print("\n".join(['matsushima-ya', 'aah matsushima-ya', #常見的用法是用換行符號還原成原字串
'matsushima-ya']))
■ 格式化字串
pi=3.14
"The value of pi is {}".format(pi) #以{}代表將要插入字串格式化後的值
"""First letter: {0}. Last letter: {1}.""" .format('A', 'Z')
#{}中設定數字代表要插入的參數的索引
"""First letter: {first}. Last letter: {last}.""" .format(last='Z', first='A')
#若{}中包括了一個字串,則可以名稱指定要插入的值
"pi = {0:.3f}".format(pi)
#數字的插入,0代表要插入的參數的索引,:代表後面要跟著格式化的程式碼,.3f代表需要的精度資訊,小數點後保留3位小數的浮點數
■ 使用正則表達式靈活地匹配字串模式
line = 'the quick brown fox jumped over a lazy dog'
import re
regex = re.compile('\s+')
regex.split(line)
#\s是一個特殊的字元,匹配所有空白字元(包含空格、TAB字元、換行符號等),+指名它在實體出現一次或多次。
for s in [" ", "abc ", " abc"]:
if regex.match(s):
print(repr(s), "matches")
else:
print(repr(s), "does not match")
line = 'the quick brown fox jumped over a lazy dog'
regex = re.compile('fox')
match = regex.search(line)
match.start()
regex.sub('BEAR', line)
■ 一個更複雜的例子
既然使用原本的方法不是更為直覺更簡單嗎?為什麼要用比較複雜的正則表達式呢?因為正則表達式的優點不只是靈活性高而已。我們來想「匹配電子郵件地址」的問題吧,這邊示範的只是簡單的例子,無法用於實作上
text = "To email Guido, try guido@python.org or the older address "\
"guido@google.com."
email = re.compile('\w+@\w+\.[a-z]{3}')
email.findall(text)
#我們可以進行進一步的操作,像是把電子郵件地址換成其他的字元串,達到保護個資的作用
email.sub('--@--.--', text)
正則表達式的語法基礎
簡單的字串直接匹配
regex = re.compile('ion')
regex.findall('Great Expectations')
. ^ $ * + ? { } [ ] \ | ( )
regex = re.compile(r'\$') #r表明是一個原始字串(raw string),\代表特殊的字元
regex.findall("the cost is $20")
print('a\tb\tc') #\t是代表tab作用
print(r'a\tb\tc') #在原始字串中不會作用
字元 | 描述 |
---|---|
\d | 匹配任意數字 |
\D | 匹配任意非數字 |
\s | 匹配任意空⽩字元 |
\S | 匹配任意非空⽩字元 |
\w | 匹配任意字⺟和數字 |
\W | 匹配任意非字⺟和數字 |
regex = re.compile('[aeiou]')
regex.split('consequential')
regex = re.compile('[A-Z][0-9]')
regex.findall('1043879, G2, H6')
regex = re.compile(r'\w{3}')
regex.findall('The quick brown fox')
regex = re.compile(r'\w+')
regex.findall('The quick brown fox')
字元 | 描述 | 舉例 |
---|---|---|
'?' | 匹配前面字元 0 次或 1 次重複 | ab?匹配 "a" 或 "ab" |
'*' | 匹配前面字元 0 次或多次重複 | ab星號匹配 "a"、"ab"、"abb"、"abbb"等等 |
'+' | 匹配前面字元 1 次或多次重複 | ab+匹配 "ab"、"abb"、"abbb"等等,但是不匹配 "a" |
'{n}' | 匹配前面字元 n 次重複 | ab{2}匹配 "abb" |
'{m,n}' | 匹配前面字元 m 次到 n 次重複 | ab{2,3}匹配 "abb" 或 "abbb" |
email = re.compile(r'\w+@\w+\.[a-z]{3}')
email2 = re.compile(r'[\w.]+@\w+\.[a-z]{3}')
email2.findall('barack.obama@whitehouse.gov')
email3 = re.compile(r'([\w.]+)@(\w+)\.([a-z]{3})')
text = "To email Guido, try guido@python.org or the older address "\
"guido@google.com."
email3.findall(text)
email4 = re.compile(r'(?P<user>[\w.]+)@(?P<domain>\w+)'\
'.(?P<suffix>[a-z]{3})')
match = email4.match('guido@python.org')
match.groupdict()
■ Refer to《Python 旋風之旅,[正體中文]Will保哥》的第15章
Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
要注意喔小心別被誤導
好的,非常感謝提醒!!