日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于正则表达式,我所知道的都在这里

發布時間:2023/12/19 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于正则表达式,我所知道的都在这里 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 一、寫在前面

  • 二、語法

    • 1. 匹配單個字符

    • 2. 匹配一組字符

    • 3. 使用元字符

    • 4. 重復匹配

    • 5. 位置匹配

    • 6. 子表達式

    • 7. 回溯引用(前后一致匹配)

    • 8. 前后查找

  • 三、在 Python 中使用

    • 1. re 庫

    • 2. pandas 庫

一、寫在前面

  • 在學習和使用正則表達式的時候,重要的并不是知道多少個特殊字符,而是會不會運用它們去解決實際問題

  • 「基本用途:搜索和替換」

  • 正則表達式是一些用來匹配和處理文本的字符串

  • 語法是正則表達式最容易掌握的部分,真正的挑戰是學會如何運用語法把實際問題分解為一系列正則表達式并最終解決

  • 在編寫正則表達式的時候,同一個問題往往會有多種解決方案

  • 驗證某個模式能不能獲得預期的匹配結果并不困難,但如何驗證它不會匹配到不想到的東西可就沒那么簡單了

  • 「正則表達式在線測試網頁」

?

「https://c.runoob.com/front-end/854/」

?網站界面

二、語法

1. 匹配單個字符

  • 正則表達式是區分字母大小寫的

  • 如果要忽略值的大小寫,需要使用 re.I

  • . 可以匹配任何一個字符、字母、數字、甚至是 . 本身

  • 在同一個正則表達式里允許使用多個 . 字符,既可以連續出現,也可以間隔出現在模式的不同位置

  • 使用 \ 對特殊字符(元字符)進行轉義,\ 本身也是一個元字符

2. 匹配一組字符

  • 使用 [] 定義字符集合

  • 在定義一個字符區間的時候,一定要避免讓這個區間的尾字符小于它的首字符(根據 ASCII 字符的大小)

  • 在字符集合以外的地方,- 只是一個普通字符,只能與 - 本身相匹配,- 字符不需要做轉義

  • ^ 對一個字符集合進行取非匹配

  • ^ ?作用于給定字符集合里的所有字符和字符區間,而不是僅限于緊跟在 ^ 后面的那一個字符或字符區間

3. 使用元字符

元字符說明
[\b]回退(刪除)一個字符
\f換頁符
「\n」「換行符」
「\r」「回車符」
「\t」「制表符」
\v垂直制表符
「\d」「任何一個數字字符,等價于[0-9]」
「\D」「任何一個非數字字符」
「\w」「等價于[a-zA-Z0-9_]」
「\W」「任何一個非字母數字或非下劃線字符」
「\s」「等價于[\f\n\r\t\v]」
「\S」「任何一個非空白字符」
\E結束 \L 或 \U 轉換
\l把下一個字符轉換為小寫
\L把 \L 到 \E 之間的字符全部轉換為小寫
\u把下一個字符轉換為大寫
\U把 \U 到 \E 之間的字符全部轉換為大寫
「(?=)」「正向前查找」
「(?!)」「負向前查找」
「(?<=)」「正向后查找」
「(?<!)」「負向后查找」
(?m)分行模式匹配
  • \r\n 是 Windows 所使用的文本行結束標簽

  • 在 Linux 上匹配空白行只使用 \n\n 即可

  • 同時適用于 Windows 和 Linux 的正則表達式應該包含一個可選的 \r 和一個必須被匹配的 \n

  • 十六進制(逢16進1)數值要用前綴 \x 來給出

  • 八進制(逢8進1)數值要用前綴 \0 來給出

  • | 表示邏輯 或 操作符

4. 重復匹配

  • + 匹配一個或多個字符(或字符集合)

  • * 匹配零個或多個字符(或字符集合)

  • ? 匹配零個或一個字符(或字符集合)

  • 如果打算同時使用 [] 和 ? ,千萬記得應該把 ? 放在字符集合的外面

  • 重復次數要用 {} 來給出,把數值寫在里面,重復的次數可以是0

  • {m,n} 為匹配次數設定一個最小值和最大值

  • {m,} 為匹配次數設定一個最小值

  • {,n} 為匹配次數設定一個最大值

  • 懶惰型元字符的寫法,只要給貪婪型元字符加上一個 ? 后綴即可

5. 位置匹配

  • 位置匹配解決在什么地方進行字符串匹配操作的問題

  • 由限定符 \b 指定單詞的邊界,用來匹配一個單詞的開頭和結尾

  • \b 匹配且只匹配一個位置,不匹配任何字符

  • 想表明不匹配一個單詞邊界,使用 \B

  • ^ 定義字符串開頭,$ 定義字符串結尾

  • ^\s* 匹配一個字符串的開頭位置和隨后的零個或多個空白字符

  • \s*$ 匹配一個字符串的結尾位置零個或多個空白字符

  • 如果要使用分行匹配模式,需要使用 re.S

6. 子表達式

  • 使用 () 來把子表達式當做一個獨立元素

  • 子表達式允許多重嵌套,但在實際工作中一個遵循適可而止的原則

  • 絕大多數嵌套子表達式都沒有看上去那么復雜

  • 把必須匹配的情況考慮周全并寫出一個匹配結果符合預期的正則表達式很容易,但把不需要匹配的情況也考慮周全并確保它們都將被排除在匹配結果之外往往要困難得多

7. 回溯引用(前后一致匹配)

  • 回溯引用允許正則表達式模式引用前面的匹配結果

  • 回溯引用指的是模式的后半部分引用在前半部分中定義的子表達式

  • 可以把回溯引用想象成變量

  • Java 和 Python 將返回一個包含 group 的數組匹配對象

  • 回溯引用只能用來引用模式里的子表達式

  • 回溯引用匹配通常從 1 開始計數(\1)

  • 如果子表達式的相對位置發生了變化,整個模式也許就不能再完成原來的工作

  • 「查找時,使用 \n ;替換時,使用$n」

  • 在對文本進行重新排版時,把文本分解成多個子表達式的做法往往非常有用,可以對文本的排版效果做出更精準的控制

  • 需要用到 re.finditer(pattern,string,flags)

list_temp?=?[] for?item?in?re.finditer(r'(?<=<h([1-6])>).*?(?=</h\1>)','<h1>一級標題</h1><h2>二級標題</h2><h3>這里是錯誤</h4>'):list_temp.append(item.group())list_temp#?['一級標題',?'二級標題']

8. 前后查找

  • 在同一個搜索模式里可以使用多個前后查找表達式

  • 向前查找指定了一個必須匹配但不在結果中返回的模式,實際就是一個以 ?= 開頭的子表達式

  • 向后查找指定了一個必須匹配但不在結果中返回的模式,實際就是一個以 ?<= 結尾的子表達式

  • 向前查找模式的長度是可變的,可以包含 \ 和 + 之類的元字符;向后查找模式只能是固定長度

  • 前后查找必須用 ! 替換掉 = 來取非

三、在 Python 中使用

1. re 庫

(1)re.findall(pattern,string,flags)

  • 返回的結果是列表,如果沒有匹配到結果,返回空列表

import?reresult?=?re.findall('工號是(.*?),','我的名字是張三,工號是110110,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生')#?['110110',?'120120']

(2)re.search(pattern,string,flags)

  • 要得到匹配結果,需要通過 group() 方法獲取值,如果沒有匹配到結果,返回 None

  • 只有在 group() 的參數為 1 時,才會返回子表達式中的結果

  • group() 的參數最大不能超過正則表達式里子表達式的個數

import?reresult?=?re.search('工號是(.*?),','我的名字是張三,工號是110110,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生').group(1)#?'110110'

(3)re.sub(pattern,replace,string,count) / re.subn(pattern,replace,string,count)

  • 可以指定替換次數,不指定則默認替換全部

import?reresult1?=?re.sub('\d+','119119','我的名字是張三,工號是110110,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生')result2?=?re.subn('\d+','119119','我的名字是張三,工號是110110,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生',1)print(result1) print(result2[0])#?我的名字是張三,工號是119119,職業是法外狂徒;他的名字是李四,工號是119119,職業是醫生 #?我的名字是張三,工號是119119,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生

(4) re.finditer(pattern,string,flags)

import?refor?item?in?re.finditer('\d+','我的名字是張三,工號是110110,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生'):print(item.group())#?110110 #?120120

(5)re.split(pattern,string,maxsplit)

  • 返回字符串被分割后的列表,可以指定最大分割次數,不指定則全部分割

import?reresult1?=?re.split('\d+','我的名字是張三,工號是110110,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生')result2?=?re.split('\d+','我的名字是張三,工號是110110,職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生',maxsplit=1)print(result1) print(result2)#?['我的名字是張三,工號是', ',職業是法外狂徒;他的名字是李四,工號是', ',職業是醫生'] #?['我的名字是張三,工號是', ',職業是法外狂徒;他的名字是李四,工號是120120,職業是醫生']

2. pandas 庫

  • 構造數據

import?pandas?as?pddf?=?pd.DataFrame(data=['纖美(CICI)','江中猴姑','PENTAL?SOFTLY','25°',?'卡士(CLASSY·KISS)'],?columns=['品牌全名']) df
  • 自定義函數

def?chinese_name(x):result?=?re.findall('[一-龜]',x)return?''.join(result)df['中文品牌名_自定義函數']?=?df['品牌全名'].apply(chinese_name) df
  • Series.str.findall(pattern, flags)

df['中文品牌名_findall']?=?df['品牌全名'].str.findall('[一-龜]').apply(lambda?x:''.join(x)) df
  • Series.str.contains(pattern,regex=True,flags)

df['英文品牌名_contains']?=?df['品牌全名'].str.contains('[a-zA-Z]',regex=True) df
  • Series.str.replace(pattern,replace)

df['英文品牌名_match']?=?df['品牌全名'].str.match('[a-zA-Z]') df
  • Series.str.extract(pattern, flags,expand) / Series.str.extractall(pattern, flags)

df['品牌名_replace']?=?df['品牌全名'].str.replace('[0-9]','XX') df
  • Series.str.match(pattern, flags).str[0]

df['品牌名_extract']?=?df['品牌全名'].str.extract(r'([a-zA-Z].*)',expand=True) df['品牌名_extract']?=?df['品牌名_extract'].str.replace('\)','') df

對比Excel系列圖書累積銷量達15w冊,讓你輕松掌握數據分析技能,感興趣的同學可以直接在各大電商平臺搜索書名了解:


總結

以上是生活随笔為你收集整理的关于正则表达式,我所知道的都在这里的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。