Python開發【模塊】:re正則

来源:http://www.cnblogs.com/lianzhilei/archive/2017/06/16/7025933.html
-Advertisement-
Play Games

re模塊 序言: re模塊用於對python的正則表達式的操作 標誌位即模式修正符,不改變正則表達式的情況下,通過模式修正符改變正則表達式的含義,從而實現一些匹配結果的調整等功能: 貪婪模式、懶惰模式: match: 從起始位置開始根據模型去字元串中匹配指定內容: 匹配ip地址: search: 根 ...


re模塊

序言:

re模塊用於對python的正則表達式的操作

'.'     預設匹配除\n之外的任意一個字元,若指定flag DOTALL,則匹配任意字元,包括換行
'^'     匹配字元開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字元結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*'     匹配*號前的字元0次或多次,re.findall("ab*","cabb3abcbbac")  結果為['abb', 'ab', 'a']
'+'     匹配前一個字元1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']
'?'     匹配前一個字元1次或0次
'{m}'   匹配前一個字元m次
'{n,m}' 匹配前一個字元n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb']
'|'     匹配|左或|右的字元,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
'(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c
'[a-z]' 匹配a到z任意一個字元
'[^()]' 匹配除()以外的任意一個字元
 
r' '    轉義引號里的字元 針對\字元  詳情查看⑦
'\A'    只從字元開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字元結尾,同$
'\d'    匹配數字0-9
'\D'    匹配非數字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
'\s'    匹配空白字元、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
   
'(?P<name>...)' 分組匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
結果{'province': '3714', 'city': '81', 'birthday': '1993'}
re.IGNORECASE  忽略大小寫 re.search('(\A|\s)red(\s+|$)',i,re.IGNORECASE)

標誌位即模式修正符,不改變正則表達式的情況下,通過模式修正符改變正則表達式的含義,從而實現一些匹配結果的調整等功能: 

# flags
I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case  匹配時忽略大小寫
L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale   做本地化識別匹配
U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale       根據Unicode字元及解析字元
M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline   多行匹配
S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline      讓.匹配包括換行符,即用了該模式修正後,"."匹配就可以匹配任意的字元了
X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments

 

貪婪模式、懶惰模式:

import re

result1 =  re.search("p.*y","abcdfphp435pythony_py")   # 貪婪模式
print(result1)
# <_sre.SRE_Match object; span=(5, 21), match='php435pythony_py'>

result2 =  re.search("p.*?y","abcdfphp435pythony_py")   # 懶惰模式
print(result2)
# <_sre.SRE_Match object; span=(5, 13), match='php435py'>

  

match:

從起始位置開始根據模型去字元串中匹配指定內容:

#match
import re                               

obj = re.match('\d+', '123uua123sf')       #從第一個字元開始匹配一個到多個數字
print(obj)                                
#<_sre.SRE_Match object; span=(0, 3), match='123'>

if obj:                                   #如果有匹配到字元則執行,為空不執行
    print(obj.group())                    #列印匹配到的內容
#123

匹配ip地址:

import re

ip = '255.255.255.253'
result=re.match(r'^([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.'
                r'([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$',ip)
print(result)
# <_sre.SRE_Match object; span=(0, 15), match='255.255.255.253'>

 

search:

根據模型去字元串中匹配指定內容(不一定是最開始位置),匹配最前

#search
import  re
obj = re.search('\d+', 'a123uu234asf')     #從數字開始匹配一個到多個數字
print(obj)
#<_sre.SRE_Match object; span=(1, 4), match='123'>

if obj:                                   #如果有匹配到字元則執行,為空不執行
    print(obj.group())                    #列印匹配到的內容
#123


import  re
obj = re.search('\([^()]+\)', 'sdds(a1fwewe2(3uusfdsf2)34as)f')     #匹配最裡面()的內容
print(obj)
#<_sre.SRE_Match object; span=(13, 24), match='(3uusfdsf2)'>

if obj:                                   #如果有匹配到字元則執行,為空不執行
    print(obj.group())                    #列印匹配到的內容
#(3uusfdsf2)

 

group與groups的區別:

#group與groups的區別
import  re
a = "123abc456"
b = re.search("([0-9]*)([a-z]*)([0-9]*)", a)
print(b)
#<_sre.SRE_Match object; span=(0, 9), match='123abc456'>
print(b.group())
#123abc456
print(b.group(0))
#123abc456
print(b.group(1))
#123
print(b.group(2))
#abc
print(b.group(3))
#456
print(b.groups())
#('123', 'abc', '456')

 

findall:

上述兩中方式均用於匹配單值,即:只能匹配字元串中的一個,如果想要匹配到字元串中所有符合條件的元素,則需要使用 findall;findall沒有group用法

#findall
import  re
obj = re.findall('\d+', 'a123uu234asf')     #匹配多個

if obj:                                   #如果有匹配到字元則執行,為空不執行
    print(obj)                             #生成的內容為列表
#['123', '234']

 

sub:

用於替換匹配的字元串(pattern, repl, string, count=0, flags=0)

#sub
import  re

content = "123abc456"
new_content = re.sub('\d+', 'ABC', content)
print(new_content)
#ABCabcABC

 

split:

根據指定匹配進行分組(pattern, string, maxsplit=0, flags=0)

#split
import  re

content = "1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )"
new_content = re.split('\*', content)       #用*進行分割,分割為列表
print(new_content)
#['1 - 2 ', ' ((60-30+1', '(9-2', '5/3+7/3', '99/4', '2998+10', '568/14))-(-4', '3)/(16-3', '2) )']

content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'"
new_content = re.split('[\+\-\*\/]+', content)
# new_content = re.split('\*', content, 1)
print(new_content)
#["'1 ", ' 2 ', ' ((60', '30', '1', '(9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14))',
#  '(', '4', '3)', '(16', '3', "2) )'"]

inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
inpp = re.sub('\s*','',inpp)                #把空白字元去掉
print(inpp)
new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1)
print(new_content)
#['1-2*((60-30+', '-40-5', '*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))']

 

補充r' ' 轉義:

fdfdsfds\fds
sfdsfds& @$
lzl.py

首先要清楚,程式讀取文件里的\字元時,添加到列表裡面的是\\

import re,sys
li = []
with open('lzl.txt','r',encoding="utf-8") as file:
    for line in file:
        li.append(line)
print(li)                   # 註意:文件中的單斜杠,讀出來後會變成雙斜杠
# ['fdfdsfds\\fds\n', 'sfdsfds& @$']
print(li[0])                # print列印的時候還是單斜杠
# fdfdsfds\fds

r字元的意義,對字元\進行轉義\只做為字元出現:

import re,sys
li = []
with open('lzl.txt','r',encoding="utf-8") as file:
    for line in file:
        print(re.findall(r's\\f', line))  #第一種方式匹配
        # print(re.findall('\\\\', line))  #第二種方式匹配
        li.append(line)
print(li)                   # 註意:文件中的單斜杠,讀出來後會變成雙斜杠
# ['s\\f']
# []
# ['fdfdsfds\\fds\n', 'sfdsfds& @$']

補充:看完下麵的代碼你可能更懵了

import re
re.findall(r'\\', line)  # 正則中只能這樣寫 不能寫成 r'\' 這樣
print(r'\\')            # 只能這樣寫 不能寫成r'\' \只能是雙數
# \\        結果
# 如果想值列印單個\ 寫成如下
print('\\')             # 只能是雙數
# \         結果

總結:文件中的單斜杠\,讀出到程式中時是雙斜杠\\,print列印出來是單斜杠\;正則匹配文件但斜杠\時,用r'\\'雙斜杠去匹配,或者不用r直接用'\\\\'四個斜杠去匹配

 

compile函數:

說明:

Python通過re模塊提供對正則表達式的支持。使用re的一般步驟是先使用re.compile()函數,將正則表達式的字元串形式編譯為Pattern實例,
然後使用Pattern實例處理文本並獲得匹配結果(一個Match實例),最後使用Match實例獲得信息,進行其他的操作

舉一個簡單的例子,在尋找一個字元串中所有的英文字元:

import re
pattern = re.compile('[a-zA-Z]')
result = pattern.findall('as3SiOPdj#@23awe')
print(result)
# ['a', 's', 'S', 'i', 'O', 'P', 'd', 'j', 'a', 'w', 'e']

匹配IP地址(255.255.255.255):  

import re

pattern = re.compile(r'^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$')
result = pattern.match('255.255.255.255')
print(result)
# <_sre.SRE_Match object; span=(0, 15), match='255.255.255.255'>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 操作系統: CentOS 6.9_x64 go語言版本: 1.8.3 問題描述 golang沒有提供生成uuid的介面,但開發中確實需要uuid。 這裡把看到的代碼記錄下,也方便我以後查閱。 解決方案 示例代碼如下: 運行效果: 討論 當然如果你只是想快速的得到uuid,而且使用的是linux系統, ...
  • 學習Java繼承之前,我們想回憶一下Java面向對象需要特別註意的幾個關鍵點。 面向對象是將複雜的事情簡單化了,它通過封裝的方式使得代碼的重用性更高和安全性更強。平時我們要學會用面向對象的方式去思考,去描述事物或行為。 想要使用OOP,一定要清楚其三個主要特征: 1.對象的行為(behavior): ...
  • 1、問題:啟動Tomcat時報錯! 主要錯誤代碼如下 1 1 在這段代碼之前還有錯誤代碼: 1 1 2、出現錯誤的環境:spring MVC + MyBatis框架下,涉及有control層、service層、dao層。 3、問題分析:一開始以為是由於control層使用@Resource出現的異常 ...
  • 最近開發一個項目,需要調用第三方的介面,第三方提供的數據是xml,我直接使用Array2XML把php數組轉成XML格式。 XML格式如: 由於php數組無法指定多個重覆下標,後面的會覆蓋前面的值,最終只會展示一個值 上面php數組用Array2XML轉成XML,body裡面只會有一個item節點。 ...
  • 本文為公司製作API介面後臺的小結! 1.命名註意事項: 不要使用易混淆的名字,如index,index01... 我喜歡用拼音... 比如: 2.資料庫文件修改: 去database.php里把數據得首碼去掉; 3.獲取請求的值: 4.操作資料庫: (1)原生操作: (2)name查詢: 5.返回 ...
  • 前言: 這幾天剛剛開始學習python,然後就安裝了pycharm,但是那個中文亂碼的問題真是讓人心煩,在網上找了好久,都寫得好亂,今天終於讓我解決了,在這裡總結一下經驗,希望可以幫到你們 問題:如下圖,我的問題主要是在控制台輸入漢字的時候會出現以下亂碼 一般的解決方法 1. 首先如上圖所示,把fi ...
  • Java 數據類型 基本數據類型 數值:int、short、long 字元:char 布爾:boolean 引用數據類型 class(類) interface(介面) 數組[] 所占位元組數 ( ) int:4位元組 char: 規定2位元組。若使用UTF 8編碼,數字和英文等占1個位元組,中文3個位元組;若 ...
  • 目錄 自定義函數 內置函數 文件的操作 練習題 一. 自定義函數 1. 函數的創建 2. 函數的參數 (1)參數的定義 參數是使用通用變數來建立函數和變數之間關係的一個變數。我們都知道函數是用來被調用的,當我們需要給這個函數傳送值的時候,參數用來接收調用者傳遞過來的數據,並保存下來作為一個變數以便後 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...