正則表達式

一 . 正則表達式正則表達式

 

1.  給段字符串判斷是不是手機號碼編程

def aa(str):
  if len(str)!=11:
     return False
  elif str[0]!="1":
    return False
  elif str[1:3]!="39" and str[1:3]!="31":
    return False

  for i in range(3,11):
      if str[i]<"0" or str[i]>"9":
         return False

  return True

age=input("請輸入你的電話號碼:")
n=aa(age)

print(n)

2. 正則概述編程語言

1. 正則表達式基礎
1.1. 簡單介紹

正則表達式並非Python的一部分。正則表達式是用於處理字符串的強大工具,擁有本身獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,
在提供了正則表達式的語言裏,正則表達式的語法都是同樣的,區別只在於不一樣的編程語言實現支持的語法數量不一樣;但不用擔憂,不被支持的語法一般是不經常使用的部分。若是已經在其餘語言裏使用過正則表達式 ,只須要簡單看一看就能夠上手了。
2. re模塊 2.1. 開始使用re Python經過re模塊提供對正則表達式的支持。 使用re的通常步驟是先將正則表達式的字符串形式編譯爲Pattern實例, 而後使用Pattern實例處理文本並得到匹配結果(一個Match實例), 最後使用Match實例得到信息,進行其餘的操做。 import re re.match函數 原型: match(pattern,string,flags=0) pattern :匹配的正則表達式(匹配格式) string :要匹配的字符串 flages : 標誌位 用於控制正則表達式的匹配方式 re.I 忽略大小寫 re.L 作本地戶識別 re.M 多行匹配 影響 ^和$ re.S 是.匹配任意包括換行符在內的全部字符 re.U 根據 Unicode 字符集解析字符 影響 \w \W \b \B re.X 使咱們以更靈活的格式理解正則表達式 參數: 功能:嘗試從字符串的起始位置匹配一個模式若是不是起始位置 成功的話,返回 None re.match() "***********************華麗的分割線***********************************" re.search()函數 原型: reach(pattern,string,flags=0) pattern :匹配的正則表達式(匹配格式) string :要匹配的字符串 flages : 標誌位 用於控制正則表達式的匹配方式 功能: 掃描整個字符串 而且返回第一個成功的匹配 str="my name is love and to bing love" a=re.search("love",str) print(a) "***********************華麗的分割線***********************************" re.findall()函數 原型: findall(pattern,string,flags=0) pattern :匹配的正則表達式(匹配格式) string :要匹配的字符串 flages : 標誌位 用於控制正則表達式的匹配方式 功能: 掃描整個字符串 並返回結果列表 str="my name is love and to bing love" a=re.findall("love",str) print(a) #['love', 'love']

3. 使用簡單的正則match函數

# re.match函數

#   原型: match(pattern,string,flags=0)
       
#       pattern :匹配的正則表達式(匹配格式)
#       string  :要匹配的字符串
#       flages : 標誌位  用於控制正則表達式的匹配方式

#       re.I        忽略大小寫
#       re.L        作本地戶識別
#       re.M        多行匹配 影響 ^和$
#       re.S        是.匹配任意包括換行符在內的全部字符
#       re.U        根據  Unicode 字符集解析字符  影響 \w  \W  \b  \B
#       re.X        使咱們以更靈活的格式理解正則表達式


#   參數:

# 功能:嘗試從字符串的起始位置匹配一個模式若是不是起始位置
#      成功的話,返回 None

# re.match()



import re

# 例如:百度網址
a=re.match("www","www.baidu.com") 
      # <_sre.SRE_Match object; span=(0, 3), match='www'>
print(a)

print("***********************華麗的分割線***********************************")

b=re.match("wwW","www.baidu.com") 
print(b)  #  None   表示沒有匹配上

print("***********************華麗的分割線***********************************")


c=re.match("wwW","www.baidu.com", flags=re.I) 
print(c)      # 不區分大小寫   
     # <_sre.SRE_Match object; span=(0, 3), match='www'>
     
print("***********************華麗的分割線***********************************")


d=re.match("www","www.baidu.com").span() 
print(d)  (0, 3)  #能夠獲得匹配的位置

4. 使用簡單正則search工具

# re.search()函數

#       原型: reach(pattern,string,flags=0)
#                   pattern :匹配的正則表達式(匹配格式)
#                   string  :要匹配的字符串
#                   flages : 標誌位  用於控制正則表達式的匹配方式

#       功能: 掃描整個字符串 而且返回第一個成功的匹配

import re

str="my name is love  and to bing love"
a=re.search("love",str)
print(a)  
 # <_sre.SRE_Match object; span=(11, 15), match='love'>

5. 使用簡單正則findallurl

# re.findall()函數

#       原型: findall(pattern,string,flags=0)
#                   pattern :匹配的正則表達式(匹配格式)
#                   string  :要匹配的字符串
#                   flages : 標誌位  用於控制正則表達式的匹配方式

#       功能: 掃描整個字符串 並返回結果列表

import re
str="my name is love  and to bing love"
a=re.findall("love",str)
print(a)  #['love', 'love']      返回匹配的個數
 

6. 正則表式元字符spa

import re


# .    匹配除換行符之外的任意字符

# [0123456789]  []是字符集合 表示匹配方括號中所包含的任意一個字符

# [love]        []  匹配 'l','o','v','e' 中任意字符

# [a-z]           匹配任意小寫字母

# [A-Z]        匹配任意大寫字母

# [0-9]        匹配任意數字 相似: [0123456789]

# [0-9a-zA-Z]  匹配任意的數字 字母包括大小寫


# [0-9a-zA-Z_] 匹配任意的數字 字母包括大小寫 和下劃線


# [^love]      匹配除了love 這幾個字母之外的全部字符  
                   # 中括號裏的^稱爲託字符 表示不匹配集合中的字符


# [^0-9]     匹配全部的非數字字符


#\d          匹配全部數字  效果如同[0-9]


# \D         匹配非數字字符    效果如同[^0-9]


# \w         匹配數字 字母  下劃線  效果如同[0-9a-zA-Z]

#  \W        匹配非數字 字母 和下劃線     效果如同[^0-9a-zA-Z
  
#   \s       匹配任意的空白符   (換行   空格  回車  換頁  製表) 
                                # 效果同 [\f \n \r \t]
                                
# \S              匹配任意的非空白符   效果同 [^\f \n \r \t]

str="my name is love  and to bing love"
a=re.search(".",str)
print(a)  
# <_sre.SRE_Match object; span=(0, 1), match='m'>
print("***********************華麗的分割線***********************************")

# [0123456789]  []是字符集合 表示匹配方括號中所包含的任意一個字符    
str="my name is love  an6d to bin5g love"
b=re.search("[0123456789]",str)
print(b)  
# <_sre.SRE_Match object; span=(19, 20), match='6'> 


print("***********************華麗的分割線***********************************")
# [love]        []  匹配 'l','o','v','e' 中任意字符
str="my name is love  and to bing love"
c=re.search("[love]",str)
print(c)  
# <_sre.SRE_Match object; span=(6, 7), match='e'>

7. 正則表式元字符 code

import re
# .    匹配除換行符之外的任意字符

# [0123456789]  []是字符集合 表示匹配方括號中所包含的任意一個字符

# [love]        []  匹配 'l','o','v','e' 中任意字符

# [a-z]           匹配任意小寫字母

# [A-Z]        匹配任意大寫字母

# [0-9]        匹配任意數字 相似: [0123456789]

# [0-9a-zA-Z]  匹配任意的數字 字母包括大小寫


# [0-9a-zA-Z_] 匹配任意的數字 字母包括大小寫 和下劃線


# [^love]      匹配除了love 這幾個字母之外的全部字符  
                   # 中括號裏的^稱爲託字符 表示不匹配集合中的字符

# [^0-9]     匹配全部的非數字字符


#\d          匹配全部數字  效果如同[0-9]


# \D         匹配非數字字符    效果如同[^0-9]


# \w         匹配數字 字母  下劃線  效果如同[0-9a-zA-Z]

#  \W        匹配非數字 字母 和下劃線     效果如同[^0-9a-zA-Z
  
#   \s       匹配任意的空白符   (換行   空格  回車  換頁  製表) 
                                # 效果同 [\f \n \r \t]
                                
# \S              匹配任意的非空白符   效果同 [^\f \n \r \t]

str="my name is love  and to bing love"
a=re.search(".",str)
print(a)  
# <_sre.SRE_Match object; span=(0, 1), match='m'>
print("***********************華麗的分割線***************************")


# [0123456789]  []是字符集合 表示匹配方括號中所包含的任意一個字符    
str="my name is love  an6d to bin5g love"
b=re.search("[0123456789]",str)
print(b)  
# <_sre.SRE_Match object; span=(19, 20), match='6'> 


print("***********************華麗的分割線***********************************")
# [love]        []  匹配 'l','o','v','e' 中任意字符
str="my name is love  and to bing love"
c=re.search("[love]",str)
print(c)  
# <_sre.SRE_Match object; span=(6, 7), match='e'>


print("***********************華麗的分割線***********************************")
print("***********************華麗的分割線***********************************")

str="my nam9e is lo6ve  and 5to bing love"
d=re.findall("\d",str)
print(d)   #['9', '6', '5']

8. re模塊深刻 分組-對象

# 分組: 

#      除了簡單判斷是否匹配以外 正則表達式還提取子串的功能 用()表示就是提取分組


print("***********************華麗的分割線***********************************")
import re

str1="010-12345678"
m=re.match(r"(\d{3})-(\d{8})",str1)


print(m.group(0))    # 010-12345678
print(m.group(1))    # 010
print(m.group(2))    # 12345678


str2="010-12345678"
v=re.match(r"(\d{3})-(\d{8})",str2)
# 使用序號獲取對應組的信息 group (0) 一隻表明的原始字符串
print(v.group(0))    # 010-12345678
print(v.group(1))    # 010
print(v.group(2))    # 12345678
print(v.groups())    #('010', '12345678')    查看匹配的各組的狀況

print("**RRRR*********************華麗的分割線***********************************")


# 編譯: 當咱們使用正則表達式時 re 模塊會幹兩件事

#      1 . 編譯正則表達式 若是正則表達式 自己不合法 會報錯

#      2. 用編譯後的正則表達式去匹配對象


# compile(pattern,flages=0)

#        pattern :匹配的正則表達式(匹配格式)
#        
a=r"^1(([3578]\d)|(47))\d{8}$"

print(re.match(a,"13600000000"))
# 編譯正則表對象
re_telephon=re.compile(a)

re_telephon.match("13600000000")     



正則函數
re.match(pattern,string,flags=0)                    re模塊 調用
re_telephon.match(string)                            re 對象調用


re.search(pattern,string,flags=0)
re_telephon.search(string)

re.findall(pattern,string,flags=0)
re_telephon.findall(string)


re.finditer(pattern,string,flags=0)
re_telephon.finditer(string)


re.sub()
re_telephon.sub(string)


re.subn()
re_telephon.subn(string)


re.split(pattern,string,maxsplit=0,flags=0)
re_telephon.split(string,maxsplit=0)

9. re模塊深刻blog

import re

# 正則字符串切割

str1="my name is lover to 哈哈哈"

print(str1.split(" "))
# ['my', 'name', 'is', 'lover', 'to', '哈哈哈']

print(re.split(r" +",str1))
# ['my', 'name', 'is', 'lover', 'to', '哈哈哈']
# 
# 


# re.finditer函數 
#       原型: .finditer(pattern,string,flags=0)
#                   pattern :匹配的正則表達式(匹配格式)
#                   string  :要匹配的字符串
#                   flages : 標誌位  用於控制正則表達式的匹配方式
#                   
#         功能:與fandall 相似掃描整個字符串  返回的是一個迭代器
#         
str3="my is zhangsan man!my a nice lisi man! my is av ery man" 
d=re.finditer(r"(my)",str3)


while True:
    try:
        l=next(d)
        print(d)
    except StopIteration as e:
        break 
# <callable_iterator object at 0x004F57B0>
# <callable_iterator object at 0x004F57B0>
# <callable_iterator object at 0x004F57B0>
# 

# re模塊 字符串替換和修改
# sub()  函數
# subn()
#      參數:sub(pattern,repl,string,count=0)  
#           subn(pattern,repl,string,count=0) 

#               pattern   :   匹配的正則表達式(匹配格式)

#               repl      :   指定的用來替換的字符串

#               string    :   目標字符串
 
#               count=0   :   最多替換次數
 
#               flages=0  :   標誌位  用於控制正則表達式的匹配方式

#  功能: 在目標字符串中以正則表達式的規則匹配字符串,在把他們替換成指定的字符串 能夠指定替換的次數 若是不指定 就替換全部的匹配字符串

# 區別:

# sub()  返回一個被指定替換的字符串

# subn()返回一個元組 第一是替換的字符串 ,第二個元素表被替換的次數



str5="my is a good good  man good "
print(re.sub(r"(good)","nice",str5))
# my is a nice nice  man


str6="my is a good good  man good and good hao to good"
print(re.sub(r"(good)","nice",str6,count=3))
# my is a nice nice  man nice and good hao to good

print("***********************華麗的分割線***********************************")

str6="my is a good good  man good "

print(re.subn(r"(good)","nice",str6))

print(type(re.subn(r"(good)","nice",str6)))

# ('my is a nice nice  man nice ', 3)

# <class 'tuple'>

10 . 錨字符(邊界字符)

import re

# 錨點字符(邊界字符)


# ^  :表示行首匹配   和[^]意思不同

# $ :   行尾匹配
#
#  \A   匹配字符串開始  它和^的區別 是   \A只匹配正個字符串的
  
#  \Z  匹配字符串的結束 它和$的區別是 \Z 只能匹配整個字符串的結束 即便在re.M模式下也不會匹配它的行尾                                                                                       #開頭,即便在 re.M模式下也不會匹配它行的行首

# \b   匹配一個單詞的邊間 也就是指單詞和空格的位置  

# \B  匹配非單詞邊界  


str="my name is love  and to bing love"

a=re.search("love$",str)

print(a)  

# <_sre.SRE_Match object; span=(29, 33), match='love'>

str="my name is love  and to bing love"
b=re.search("^my",str)
print(b)  
# <_sre.SRE_Match object; span=(0, 2), match='my'>
print("***********************華麗的分割線***************************")

str="my name is love  and to bing love\n my 哈哈哈 loer"
e=re.findall("^my",str,re.M)
print(e)  
# ['my']

print("***********************華麗的分割線***************************")

str="my name is love  and to bing love\n my 哈哈哈 love"
g=re.findall("love$",str,re.M)
print(g)   # ['love'] ['love']


str="my name is love  and to bing love\n my 哈哈哈 love"
f=re.findall("love\Z",str,re.M)
print(f)   #['love']

print("***********************華麗的分割線***************************")

str="my name is love  and to bing love my 哈哈哈 love"
h=re.search("lo\b",str,re.M)
print(h)   # None


str="my name is love  and to bing love my 哈哈哈 love"
j=re.search("lo\B",str,re.M)
print(j)   #<_sre.SRE_Match object; span=(11, 13), match='lo'>

11. 字符匹配多個

import re
   # zyx  n m是假設的


   # (xyz)  匹配小括號的xyz (做爲一個總體去匹配) 
    

   # x?   匹配零個或者多個X            

   #  x*   匹配0個或者任意多個x    貪婪匹配 儘量多匹配
 
   #  x+  匹配至少一個x

   # x{n}   去匹配肯定n個x (n是一個非負數)

   # x{n,}  匹配至少n個x

    
   # x{n,m}  匹配至少n個最多m個x 注意:n<=m 
  
   # x|Y    匹配的是x或者y
   
print("***********************華麗的分割線***************************")

print(re.findall(r"(lover)","my name lover to boy  lover"))  #['lover']
# ['lover', 'lover']  

print("***********************華麗的分割線***************************")
print(re.findall(r"o?","my name lover to boy  lover"))
# [ 'o', '', '', '', '', '', 'o', '', '', 'o', '', '', '', '', 'o', '', '', '', '']

print("***********************華麗的分割線***************************")
print(re.findall(r"a*","aaaabbbba"))
# ['aaaa', '', '', '', '', 'a', ''] 
 
print("***********************華麗的分割線***************************")
print(re.findall(r"a+","aaaabbbbaAA"))    #['aaaa', 'a']  

print("***********************華麗的分割線***************************")
print(re.findall(r"a{3}","aaaabbbbaAA"))#['aaa']   


print("***********************華麗的分割線***************************")
print(re.findall(r"a{3,}","aaaabbbbaAAAAaaaaaaaAA"))
#['aaaa', 'aaaaaaa']


print("***********************華麗的分割線***************************")
print(re.findall(r"a{3,6}","aaaabbbbaAAAAaaaaaavaaaaaaaaAA"))
#['aaaa', 'aaaaaa', 'aaaaaa']

print("***********************華麗的分割線***************************")
print(re.findall(r"((l|L)over)","lover=====Lover"))
# [('lover', 'l'), ('Lover', 'L')]

12. 練習正則

import re
# 需求: 

srt="my is a good man!my is a niace man! my is a very handsome man"
print(re.findall(r"^my(.*?)man$",srt))

print("***********************華麗的分割線***************************")

# *? +? x?  最小匹配 一般都是儘量多的匹配 可使用這種能夠解決貪婪模式

(?:x)     相似(xyz) 可是不表示 一個組



 

13. 練習正則

import re

# 給段字符串判斷是不是手機號碼

def aa(str):
  if len(str)!=11:
     return False
  elif str[0]!="1":
    return False
  elif str[1:3]!="39" and str[1:3]!="31":
    return False

  for i in range(3,11):
      if str[i]<"0" or str[i]>"9":
         return False

  return True

age=input("請輸入你的電話號碼:")
n=aa(age)

print(n)

def cc(str):
    # "13912345678"
    
    a=r"^1(([3578]\d)|(47))\d{8}$"
    
    res=re.match(a,str)
    
    return res
    
    
print(cc("13912345678"))

14. 練習正則

 QQ    : 1837855846

 mail  :   loveraa@163.com

 phone :   010-55348765


 user :

  ip :


 url :  


# QQ正則
 re_QQ=re.compile(r"^[1-9]\d{5,9}$")
 print(re_QQ.search("1234567890"))


re.compile() 函數
編譯正則表達式模式,返回一個對象。可
以把經常使用的正則表達式編譯成正則表達式對象,方便後續調用及提升效率。
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息