Python學習筆記5(字符串與正則表達式)


1.字符串

1.1字符串的格式化

 #格式化語法
"%s" % str1
 "%s %s" % (str1,str2) 
#格式化字符串 

str1 = "version" 
num = 1.0
 format = "%s" % str1 
print (format) 
format = "%s %d" %(str1, num) 
print (format)

 

#使用字典格式化字符串 
print ("%(version)s: %num).1f" %{"version": "version", "num": 2})              #version:2.0 
#字符串對齊
word = "version3.0"                       #10個字符 
print (word.center(20))                   #在20字符寬度中位於中間。因此,輸出:version3.0 兩邊各5個空格 
print (word.center(20, "*"))            #*****version3.0***** 
print (word.ljust(0)))                      #ljust()使輸出結果左對齊 
print (word.rjust(20))                     #在20字符寬度中右對齊 
print("%30s" % word)                    # "%30" 表示先輸出30個空格

 

 1.2字符串的轉義符

轉義符設定及其輸出類似於C。

 #r的特殊用法 
path = r"hello\tworld\n" 
print (path)                                            #hello\tworld\n 
#strip()去掉轉義字符 
word = "\thello world\n" 
print ("strip()后輸出:", word.strip())                       #strip()后輸出:hello world (去掉了轉義字符后輸出) 
print ("lstrip()后輸出:", word.lstrip())                     #lstrip()后輸出:hello world (去掉了句首轉義字符\t,句尾\n保留) 
print ("rstrip()后輸出:", word.rstrip())                     #rstrip()后輸出:hello world(去掉了\n,保留句尾句首轉義字符\t)

1.3字符串的合並

可以直接使用“+”連接兩個字符串,也可使用如下幾種方法。

# 使用join()連接字符串
strs = ["hello ", "world ", "hello ", "China "]
result = "".join(strs)
print result                       #hello world hello China
# 使用reduce()連接字符串
from functools import reduce
import operator
strs = ["hello ", "world ", "hello ", "China "]
result = reduce(operator.add, strs, "")
print (reduce)

字符串連接后,Python將分配新的空間給連接后的字符串,源字符串保持不變。

str1 ="a"
print (id(str1))
print (id(str1 + "b"))                           # 輸出結果不同

1.4字符串的截取

 可以使用索引截取字符串,也可使用如下方法。

# 切片語法
string[start: end: step]                    # 從第start個索引到第end個索引,步長為step          

# 特殊切片截取子串
str1 = "hello world"
print (str1[0:3])                 # hell
print (str1[::2])                  # hlowrd
print (str1[1::2])                # el ol"
# split()函數
split([char] [,num])                             
# char表示用於分割的字符,默認為空格
# num表示分割的次數。若num=2,分割為3個字符 
# 默認情況下,根據char在字符中出現字數來分割子串
# 函數的返回值為由子串組成的列表

# 使用split()獲取子串
sentence = "Bob said: 1, 2, 3, 4"
print (sentence.split())              # 使用空格分割  ['Bob', 'said:', '1,', '2,' '3', '4']
print (sentence.split(","))           # 使用逗號分割
print (sentence.split(",",2))        # 使用兩個逗號分割   
# ['Bob said: 1', '2' '3, 4']         費解!!!
 

1.5字符串的比較

可直接使用“==”與“!=”比較兩個字符串。

要比較字符串的開頭或結尾部分,可使用startswith()或endswith()函數

# startswith()
startswith(substring, [,start [,end]])
# substring是與源字符串開頭部分比較的子串
# start表示開始位置,end表示結尾位置
# 若字符串以substring開頭,返回True

# 用法
word = "hello world"
print ("hello" == word[0:5])
print (word.startswith("hello")
print (word.endwith("ld",6))                  # 從結尾到word[6]間搜索
print (word.endwith("ld",6, 10))             # 在word[6:10]中搜索
print (word.endwith("ld",6, len(word)))    # 在word[6:11]中搜索 

1.6字符串的反轉

# 循環輸出反轉的字符串
def reverse(s):
    out = ""
    li = list(s)
    for i in range(len(li), 0, -1):
        out += "".join(li[i-1])
return out


# 方法二
def reverse(s):
    li = list(s)
    li.reverse()
    s = "".join(li)
return s

1.7字符串的查找和替換

# find()函數
find(substring [, start [ ,end]])
# 在[start:end]間查找substring,若找到返回第1次出現的索引,否則返回-1

# rfind()參數與find()相同,不同的是前者從末尾開始查找子串

# 查找字符串
sentence = "this is a apple."
print (sentence.find("a"))                  # 8
print (sentence.rfind("a"))                 # 10
# replace()函數
replace(old, new [, max])
# 用new替換old,max表示替換次數。 返回一個新的字符串。

# 用法
sentence = "hello world, hello China"
print (sentence.replace("hello","hi"))            # hi world, hi China
print (sentence.replace("hello","hi", 1))        # hi world, hello China
print (sentence.replace("abc","hi"))              # hello world, hello China

PS: replace()先創建變量sentence的拷貝,然后在拷貝中替換字符串,並不會改變sentence的內容

1.8字符串與日期轉換 

# strftime()
strftime(format[, tuple])  -> string
# format表示格式化日期的特殊字符
# tuple表示需要轉換的時間,用元組儲存。其中元素分別為年、月、日、分、秒
# 函數返回一個表示時間的字符串

字符串到時間的轉換需要進行兩次,使用time模板和datetime類,轉換過程分為以下三步驟。

  • 調用函數strptime()把字符串轉換為一個元組
strftime(format[, tuple])  -> string
  • 把表示時間的元組賦值給表示年、月、日的3個變量
  • 把表示年月日的三個變量傳遞給函數datetime(),進行第二次轉換。
datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
# 函數返回一個datetime類型的變量

 

# 時間轉換過程
import time,datetime

# 時間到字符串的轉換
print (time.strftime("%Y-%m-%d %X", time.localtime()))                # 2016-09-24 15:42:33

# 字符串到時間的轉換
t = time.strptime("2016-09-24", "%Y-%m-%d")
y, m ,d = t[0:3]
print (datetime.datetime(y,m,d))                # 2016-09-24 00:00:00

 2.正則表達式

2.1簡介

正則表達式用於搜索、替換和替換字符串。使用其編寫一些邏輯驗證非常方便。

正則表達式是用於文本匹配的工具,它在源字符串中查找與給定的正則表達式相匹配的部分。一個正則表達式是由字母、數字和特殊字符(括號、星號、問號等)組成。

符號 描述 符號 描述
^ 表達式的開始字符。在[^m] 中例外      \b 匹配單詞的開始和結束
$ 表達式的結束字符 \B 匹配不是單詞的開始和結束的位置     
\w 匹配字母、數字、下划線 . 匹配任意字符,包括漢字
\W 匹配不是字母、數字、下划線的字符 [m] 匹配單個字符串
\s 匹配空白字符 [m1m2...n] 匹配多個字符串
\S 匹配不是空白的字符 [m-n] 匹配m到n區間內的數字、字母
\d 匹配數字 [^m] 匹配除m以外的字符串
\D 匹配非數字的字符 () 對正則表達式進行分組,一對圓括號表示一組    
* 重復0或N次 {m} 重復m次
+ 重復1或N次 {m,n} 該限定符的意思是至少有 m 個重復,至多到 n 個重復
? 重復0或1次    
       

 

\d{3}-\d{8} | \d{4}-\d{7}
#  表示區號為3位的8位數電話號碼或區號為4位的7位數電話號碼

#  也有的在區號兩側加圓括號分隔
[\( ]?\d{3}[\]-?\d{8}|[\( ]?\d{4}[\]-]?\d{7}
# ()是正則表達式特殊字符  前要加\

# 對三位數字重復三次
(\d\d\d){2}
# \d\d\d{2}   相當於 \d\d\d\d


# 通常,正則表達式匹配最長字符串。可在限定符后加"?",獲取最短匹配
a.*c
# 對從a到c的字符串最長匹配
a.*?c
#  對從a到c的字符串最短匹配
符號 描述 符號 描述
*? 匹配零次或多次,且匹配最短 (?#...) 正則表達式中的注釋
+? 匹配一次或多次,且匹配最短 (?P<name>...) 給分組命名,name表示分組的名稱
?? 匹配一次或零次,且匹配最短 (?P=name) 使用名為name的分組
{m,n}? 重復m次,且匹配最短    

2.2使用re模塊處理正則表達式

Python的re模塊具有正則表達式的功能。re模塊提供了一些根據正則表達式進行查找、替換、分隔字符串的函數,這些函數使用正則表達式作為第一個參數。

函數 描述
re.compile(pattern, flags=0) 編譯正則表達式,返回RegexObject對象,然后可以通過RegexObject對象調用match()和search()方法。第二個參數flags是匹配模式,例如,re.IGNORECASE=2,re.MULTILINE=8(忽略大小寫,從新行開始搜索)等等。
re.search(pattern, string, flags=0) 在字符串中查找,是否能匹配正則表達式。返回_sre.SRE_Match對象,如果不能匹配返回None。
re.match(pattern, string, flags=0) 字符串的開頭是否能匹配正則表達式。返回_sre.SRE_Match對象,如果不能匹配返回None
re.split(pattern, string, maxsplit=0) 根據pattern分隔string,maxsplit表示最大分割數
re.findall(pattern, string, flags=0) 找到 RE 匹配的所有子串,並把它們作為一個列表返回。這個匹配是從左到右有序地返回。如果無匹配,返回空列表。
re.finditer(pattern, string, flags=0) 找到 RE 匹配的所有子串,並把它們作為一個迭代器返回。這個匹配是從左到右有序地返回。如果無匹配,返回空列表
re.sub(pattern, repl, string, count=0, flags=0) 找到 RE 匹配的所有子串,並將其用一個不同的字符串替換。可選參數 count 是模式匹配後替換的最大次數;count 必須是非負整數。缺省值是 0 表示替換所有的匹配。如果無匹配,字符串將會無改變地返回。
re.subn(pattern, repl, string, count=0, flags=0) 與re.sub方法作用一樣,但返回的是包含新字符串和替換執行次數的兩元組。
re.escape(string) 對字符串中的非字母數字進行轉義
re.purge() 清空緩存中的正則表達式

正則表達式積累——常用:

1.  .*? 是一個固定的搭配,.和*代表可以匹配任意無限多個字符,加上?表示使用非貪婪模式進行匹配,也就是我們會盡可能短地做匹配。

2.  (.*?)代表一個分組,在這個正則表達式中我們匹配了五個分組,匹配完成后遍歷item,item[0]就代表第一個(.*?)所指代的內容,item[1]就代表第二個(.*?)所指代的內容,以此類推。

3. re.S 標志代表在匹配時為點任意匹配模式,點 . 也可以代表換行符。用於( re.compile() )中的flags參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM