python筆記--2--字符串、正則表達式


字符串
  ASCII碼采用1個字節來對字符進行編碼,最多只能表示256個符號。
  UTF-8以3個字節表示中文
  GB2312是我國制定的中文編碼,使用1個字節表示英語,2個字節表示中文;GBK是GB2312的擴充,而CP936是微軟在GBK基礎上開發的編碼方式。GB2312、GBK和CP936都是使用2個字節表示中文。
  Python 3.x完全支持中文字符,默認使用UTF8編碼格式,無論是一個數字、英文字母,還是一個漢字,都按一個字符對待和處理。(字符並非字節)
  在Python中,字符串屬於不可變序列類型,除了支持序列通用方法(包括分片操作)以外,還支持特有的字符串操作方法。

常用格式字符

格式字符

說明

%s

字符串 (采用str()的顯示)

%r

字符串 (采用repr()的顯示)

%c

單個字符

%b

二進制整數

%d

十進制整數

%i

十進制整數

%o

八進制整數

%x

十六進制整數

%e

指數 (基底寫為e)

%E

指數 (基底寫為E)

%f、%F、%F

浮點數

%g

指數(e)或浮點數 (根據顯示長度)

%G

指數(E)或浮點數 (根據顯示長度)

%%

字符"%""%"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                                                                                          

字符串常用方法
  find()和rfind方法分別用來查找一個字符串在另一個字符串指定范圍(默認是整個字符串)中首次和最后一次出現的位置,如果不存在則返回-1;
  index()和rindex()方法用來返回一個字符串在另一個字符串指定范圍中首次和最后一次出現的位置,如果不存在則拋出異常;
  count()方法用來返回一個字符串在另一個字符串中出現的次數。
  split()和rsplit()方法分別用來以指定字符為分隔符,將字符串左端和右端開始將其分割成多個字符串,並返回包含分割結果的列表;如果不指定分隔符,則字符串中的任何空白符號(包括空格、換行符、制表符等等)都將被認為是分隔符,返回包含最終分割結果的列表。split()和rsplit()方法還允許指定最大分割次數
  partition()和rpartition()用來以指定字符串為分隔符將原字符串分割為3部分,即分隔符前的字符串、分隔符字符串、分隔符后的字符串,如果指定的分隔符不在原字符串中,則返回原字符串和兩個空字符串。
  join()方法用於字符串連接,不推薦使用+運算符連接字符串,優先使用join()方法,因為join()方法效率更高。
  lower()返回小寫字符串
  upper()返回大寫字符串
  capitalize()字符串首字符大寫
  title()每個單詞的首字母大寫
  swapcase()大小寫互換
  replace()查找替換,類似於“查找與替換”功能
  maketrans()方法用來生成字符映射表,而translate()方法用來根據映射表中定義的對應關系轉換字符串並替換其中的字符,使用這兩個方法的組合可以同時處理多個不同的字符,replace()方法則無法滿足這一要求。

#創建映射表,將字符"abcdef123"一一對應地轉換為"uvwxyz@#$"
>>> table = ''.maketrans('abcdef123', 'uvwxyz@#$')
>>> s = "Python is a greate programming language. I like it!"
#按映射表進行替換
>>> s.translate(table)
'Python is u gryuty progrumming lunguugy. I liky it!'

  strip()刪除指定字符,默認是刪除空白字符
  rstrip()刪除字符串右端指定字符
  lstrip()刪除字符串左端指定字符
  這三個函數的參數指定的字符串並不作為一個整體對待,而是在原字符串的兩側、右側、左側刪除參數字符串中包含的所有字符,一層一層地從外往里扒。

  eval() 函數用來執行一個字符串表達式,並返回表達式的值。小心使用!

  startswith()、endswith(),判斷字符串是否以指定字符串開始或結束
  center()、ljust()、rjust(),返回指定寬度的新字符串,原字符串居中、左對齊或右對齊出現在新字符串中,如果指定寬度大於字符串長度,則使用指定的字符(默認為空格)進行填充。
  zfill()返回指定寬度的字符串,在左側以字符0進行填充。指定寬度小於字符串長度時,返回字符串本身。

  isalnum()檢測字符串是否由字母和數字組成。
  isalpha()檢測字符串是否只由字母組成。
  isdigit()檢測字符串是否只由數字組成。
  isdecimal()檢查字符串是否只包含十進制字符。這種方法只存在於unicode對象。
  isnumeric()檢測字符串是否只由數字組成。這種方法是只針對unicode對象。支持漢子數字、羅馬數字
  isspace()檢測字符串是否只由空格組成。
  isupper()檢測字符串中所有的字母是否都為大寫。
  islower()檢測字符串是否由小寫字母組成。
  istitle()檢測字符串中所有的單詞拼寫首字母是否為大寫,且其他字母為小寫。

  Pytho標准庫zlib中提供的compress()和decompress()函數可以用於數據的壓縮和解壓縮,在壓縮字符串之前需要先編碼為字節串。信息重復度越高,壓縮比越大。

 

正則表達式

元字符

功能說明

.

匹配除換行符以外的任意單個字符

*

匹配位於*之前的字符或子模式的0次或多次出現

+

匹配位於+之前的字符或子模式的1次或多次出現

-

在[]之內用來表示范圍

|

匹配位於|之前或之后的字符

^

匹配行首,匹配以^后面的字符開頭的字符串

$

匹配行尾,匹配以$之前的字符結束的字符串

?

匹配位於?之前的0個或1個字符。當此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時,匹配模式是“非貪心的”。“非貪心的”模式匹配搜索到的、盡可能短的字符串,而默認的“貪心的”模式匹配搜索到的、盡可能長的字符串。例如,在字符串“oooo”中,“o+?”只匹配單個“o”,而“o+”匹配所有“o”

\

表示位於\之后的為轉義字符

\num

此處的num是一個正整數。例如,“(.)\1”匹配兩個連續的相同字符

\f

換頁符匹配

\n

換行符匹配

\r

匹配一個回車符

\b

匹配單詞頭或單詞尾

\B

與\b含義相反\b含義相反

\d

匹配任何數字,相當於[0-9]

\D

與\d含義相反,等效於[^0-9]

\s

匹配任何空白字符,包括空格、制表符、換頁符,與 [ \f\n\r\t\v] 等效

\S

與\s含義相反

\w

匹配任何字母、數字以及下划線,相當於[a-zA-Z0-9_]

\W

與\w含義相反\w含義相反,與“[^A-Za-z0-9_]”等效

()

將位於()內的內容作為一個整體來對待

{}

按{}中的次數進行匹配

[]

匹配位於[]中的任意一個字符

[^xyz]

反向字符集,匹配除x、y、z之外的任何字符

[a-z]

字符范圍,匹配指定范圍內的任何字符

[^a-z]

反向范圍字符,匹配除小寫英文字母之外的任何字符

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                                                                                          

最簡單的正則表達式是普通字符串,可以匹配自身
'[pjc]ython'可以匹配'python'、'jython'、'cython'
'[a-zA-Z0-9]'可以匹配一個任意大小寫字母或數字
'[^abc]'可以一個匹配任意除'a'、'b'、'c'之外的字符
'python|perl'或'p(ython|erl)'都可以匹配'python'或'perl'
子模式后面加上問號表示可選。r'(http://)?(www\.)?python\.org'只能匹配'http://www.python.org'、'http://python.org'、'www.python.org'和'python.org'
'^http'只能匹配所有以'http'開頭的字符串
(pattern)*:允許模式重復0次或多次
(pattern)+:允許模式重復1次或多次
(pattern){m,n}:允許模式重復m~n次
'(a|b)*c':匹配多個(包含0個)a或b,后面緊跟一個字母c。
'ab{1,}':等價於'ab+',匹配以字母a開頭后面帶1個至多個字母b的字符串。
'^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$':匹配長度為5-20的字符串,必須以字母開頭、可帶數字、“_”、“.”的字串。
'^(\w){6,20}$':匹配長度為6-20的字符串,可以包含字母、數字、下划線。
'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$':檢查給定字符串是否為合法IP地址。
'^(13[4-9]\d{8})|(15[01289]\d{8})$':檢查給定字符串是否為移動手機號碼。
'^[a-zA-Z]+$':檢查給定字符串是否只包含英文字母大小寫。
'^\w+@(\w+\.)+\w+$':檢查給定字符串是否為合法電子郵件地址。
'^(\-)?\d+(\.\d{1,2})?$':檢查給定字符串是否為最多帶有2位小數的正數或負數。
'[\u4e00-\u9fa5]':匹配給定字符串中所有漢字。
'^\d{18}|\d{15}$':檢查給定字符串是否為合法身份證格式。
'\d{4}-\d{1,2}-\d{1,2}':匹配指定格式的日期,例如2016-1-31。
'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[,._]).{8,}$':檢查給定字符串是否為強密碼,必須同時包含英語字母大寫字母、英文小寫字母、數字或特殊符號(如英文逗號、英文句號、下划線),並且長度必須至少8位。
"(?!.*[\'\"\/;=%?]).+":如果給定字符串中包含’、”、/、;、=、%、?則匹配失敗。
'(.)\\1+':匹配任意字符的一次或多次重復出現。
'((?P<f>\b\w+\b)\s+(?P=f))':匹配連續出現兩次的單詞。
'((?P<f>.)(?P=f)(?P<g>.)(?P=g))':匹配AABB形式的成語或字母組合。

re模塊主要方法

方法

功能說明

compile(pattern[, flags])

創建模式對象

escape(string)

將字符串中所有特殊正則表達式字符轉義

findall(pattern, string[, flags])

列出字符串中模式的所有匹配項

finditer(pattern, string, flags=0)

返回包含所有匹配項的迭代對象,其中每個匹配項都是match對象

fullmatch(pattern, string, flags=0)

嘗試把模式作用於整個字符串,返回match對象或None

match(pattern, string[, flags])

從字符串的開始處匹配模式,返回match對象或None

purge()

清空正則表達式緩存

search(pattern, string[, flags])

在整個字符串中尋找模式,返回match對象或None

split(pattern, string[, maxsplit=0])

根據模式匹配項分隔字符串

sub(pat, repl, string[, count=0])

將字符串中所有pat的匹配項用repl替換,返回新字符串,repl可以是字符串或返回字符串的可調用對象,該可調用對象作用於每個匹配的match對象

subn(pat, repl, string[, count=0])

將字符串中所有pat的匹配項用repl替換,返回包含新字符串和替換次數的二元元組,repl可以是字符串或返回字符串的可調用對象,該可調用對象作用於每個匹配的match對象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                                                                                          

直接使用re模塊方法:

import re


text = 'alpha. brta....gamma delta'
print(re.split(r'[. ]+', text))     # 以.和空格為分隔符進行分隔,r表示原生字符
# ['alpha', 'brta', 'gamma', 'delta']

text = 'alpha. brta....gamma delta'
print(re.split(r'[. ]+', text, maxsplit=2))     # 以.和空格為分隔符進行分隔,r表示原生字符,最大分隔次數為2
# ['alpha', 'brta', 'gamma delta']

text = 'alpha. brta....gamma delta'
pat = '[a-zA-Z]+'
print(re.findall(pat, text))        # 查找所有單詞
# ['alpha', 'brta', 'gamma', 'delta']

s = "It's a very good good idea"
print(re.sub(r'(\b\w+) \1', r'\1', s))      # 去除重復的單詞,\1對應的是前面的第一個括號所匹配到的字符串
# It's a very good idea

print(re.sub('a', lambda x: x.group(0).upper(), 'aaa abc abde'))
# AAA ABc ABde
print(re.sub('[a-z]', lambda x: x.group(0).upper(), 'aaa abc abde'))
# AAA ABC ABDE
print(re.sub('[a-zA-z]', lambda x: chr(ord(x.group(0)) ^ 32), 'aaa aBc abDe'))      # ord()返回字符的ASCII碼,與32異或之后,用chr()返回對應的字符
# AAA AbC ABdE

print(re.escape('http://www.baidu.com'))
# http\:\/\/www\.baidu\.com

example = 'Beautiful is better b than ugly.'
print(re.findall(r'\bb.+?\b', example))
# ?表示非貪心模式,結果為  ['better', 'b ']
# 去掉問號后,為貪心模式,結果為  ['better b than ugly']

example = 'Beautiful is better b than ugly.'
print(re.findall(r'\Bh.+?\b', example))
# 表示不以h開頭且內部函數h的單詞的一部分,結果為  ['han']

example = 'Beautiful is better b than ugly.'
print(re.findall(r'\b\w.+?\b', example))
# 匹配所有的單詞,結果為  ['Beautiful', 'is', 'better', 'b ', 'than', 'ugly']

s = '<html><head>This is head.</head><body>This is body.</body></html>'
pattern = r'<html><head>(.+)</head><body>(.+)</body></html>'
result = re.search(pattern, s)
print(result.group(1))
# 第一個子模式,結果為  This is head.
print(result.group(2))
# 第二個子模式,結果為  This is body.


m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
print(m.group('first_name'))          # 使用命名的子模式
# Malcolm
print(m.group('last_name'))          # 使用命名的子模式
# Reynolds
print(m.groups())       # 以元組的形式返回
# ('Malcolm', 'Reynolds')
print(m.groupdict())        # 以字典的形式返回
# {'first_name': 'Malcolm', 'last_name': 'Reynolds'}

使用正則表達式對象:

match(string[, pos[, endpos]])方法在字符串開頭或指定位置進行搜索,模式必須出現在字符串開頭或指定位置;
search(string[, pos[, endpos]])方法在整個字符串或指定范圍中進行搜索;
正則表達式對象的match方法和search方法匹配成功后返回match對象。match對象的主要方法有:
  group():返回匹配的一個或多個子模式內容
  groups():返回一個包含匹配的所有子模式內容的元組
  groupdict():返回包含匹配的所有命名子模式內容的字典
  start():返回指定子模式內容的起始位置
  end():返回指定子模式內容的結束位置的前一個位置
  span():返回一個包含指定子模式內容起始位置和結束位置前一個位置的元組。
findall(string[, pos[, endpos]])方法字符串中查找所有符合正則表達式的字符串並以列表形式返回。
正則表達式對象的sub(repl, string[, count = 0])和subn(repl, string[, count = 0])方法用來實現字符串替換功能,其中參數repl可以為字符串或返回字符串的可調用對象。
正則表達式對象的split(string[, maxsplit = 0])方法用來實現字符串分隔。

使用正則表達式提取字符串中的電話號碼:

import re


telNumber = '''Suppose my Phone No. is 0535-1234567, yours is 010-12345678, his is 025-87654321.'''
pattern = re.compile(r'(\d{3,4})-(\d{7,8})')
index = 0
while True:
    matchResult = pattern.search(telNumber, index)      # 從指定位置開始匹配
    if not matchResult:
        break
    print('-'*30)
    print('Success:')
    for i in range(3):
        print('Searched content:', matchResult.group(i),
              ' Start from:', matchResult.start(i),
              'End at:', matchResult.end(i),
              ' Its span is:', matchResult.span(i))
    index = matchResult.end(2)      # 指定下次匹配的開始位置

'''
------------------------------
Success:
Searched content: 0535-1234567  Start from: 24 End at: 36  Its span is: (24, 36)
Searched content: 0535  Start from: 24 End at: 28  Its span is: (24, 28)
Searched content: 1234567  Start from: 29 End at: 36  Its span is: (29, 36)
------------------------------
Success:
Searched content: 010-12345678  Start from: 47 End at: 59  Its span is: (47, 59)
Searched content: 010  Start from: 47 End at: 50  Its span is: (47, 50)
Searched content: 12345678  Start from: 51 End at: 59  Its span is: (51, 59)
------------------------------
Success:
Searched content: 025-87654321  Start from: 68 End at: 80  Its span is: (68, 80)
Searched content: 025  Start from: 68 End at: 71  Its span is: (68, 71)
Searched content: 87654321  Start from: 72 End at: 80  Its span is: (72, 80)
'''

子模式擴展語法:

(?P<groupname>):為子模式命名
(?iLmsux):設置匹配標志,可以是幾個字母的組合,每個字母含義與編譯標志相同
(?:...):匹配但不捕獲該匹配的子表達式
(?P=groupname):表示在此之前的命名為groupname的子模式
(?#...):表示注釋
(?=…):用於正則表達式之后,表示如果=后的內容在字符串中出現則匹配,但不返回=之后的內容
(?!...):用於正則表達式之后,表示如果!后的內容在字符串中不出現則匹配,但不返回!之后的內容
(?<=…):用於正則表達式之前,與(?=…)含義相同
(?<!...):用於正則表達式之前,與(?!...)含義相同


免責聲明!

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



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