【Python基礎(chǔ)】正則表達式處理字符串

使用正則表達式前移除空白:使用re.sub(r'\s+', '', text)替換strip()以確保移除所有空白字符。

正則表達式(Regular Expression接剩,簡稱regex或regexp)是一種用于匹配字符串中字符組合的模式虽风。它使用單個字符串來描述蚯窥、匹配一系列符合某個句法規(guī)則的字符串什乙。在Python中淋硝,正則表達式通過re模塊提供,這個模塊包括各種功能強大的方法來處理字符串父能。

以下是一些基本的正則表達式用法的詳解:

1. 導(dǎo)入模塊

在使用正則表達式之前神凑,需要先導(dǎo)入Python的re模塊。

import re

2. 基本匹配

使用re.match()來檢查字符串是否從開始就符合正則表達式法竞。

# 檢查字符串是否完全匹配正則表達式
match = re.match(r'^\d+$', '12345')  # 匹配成功耙厚,返回一個Match對象
if match:
    print("匹配成功")
else:
    print("匹配失敗")

3. 搜索

使用re.search()來搜索字符串中首次出現(xiàn)的匹配項。

# 搜索字符串中首次出現(xiàn)的匹配項
search = re.search(r'\d+', 'Hello 123, how are you?')
if search:
    print("找到匹配項:", search.group())

4. 查找所有匹配

使用re.findall()來找出字符串中所有匹配的項岔霸。

# 查找字符串中所有匹配的項
findall = re.findall(r'\d+', '123, 456, 7890')
print("所有匹配項:", findall)

5. 替換

使用re.sub()來替換字符串中的匹配項薛躬。

# 替換字符串中的匹配項
sub = re.sub(r'\d+', 'XXX', 'Hello 123, goodbye 456')
print("替換后的字符串:", sub)

6. 分割

使用re.split()來根據(jù)正則表達式分割字符串。

# 根據(jù)正則表達式分割字符串
split = re.split(r'\s+', 'Hello 123, goodbye 456 world')
print("分割后的字符串列表:", split)

7. 編譯正則表達式

如果需要多次使用相同的正則表達式呆细,可以先編譯它以提高效率型宝。

# 編譯正則表達式
pattern = re.compile(r'\d+')
result = pattern.findall('123 456 789')
print("編譯后的匹配項:", result)

8. 正則表達式的特殊字符

  • .:匹配任意單個字符(除了換行符)。
  • ^:匹配字符串的開始絮爷。
  • $:匹配字符串的結(jié)束趴酣。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次坑夯。
  • ?:匹配前面的字符零次或一次岖寞。
  • {m,n}:匹配確定的次數(shù)值。
  • []:匹配括號內(nèi)的任意字符柜蜈。
  • |:邏輯或操作符仗谆。
  • \:轉(zhuǎn)義特殊字符或表示特殊序列。

9. 正則表達式中的斷言

  • (?=...):正向前瞻斷言淑履,匹配...前面的位置隶垮。
  • (?!...):負向前瞻斷言,匹配除了...之外的前面的位置秘噪。
  • (?<=...):正向后瞻斷言狸吞,匹配...后面的位置。
  • (?<!...):負向后瞻斷言指煎,匹配除了...之外的后面的位置蹋偏。

10. 捕獲組

使用圓括號()來創(chuàng)建捕獲組,以便從匹配項中提取子模式贯要。

# 使用捕獲組提取信息
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
match = pattern.match('Today is 2023-07-22')
if match:
    print("捕獲的年份:", match.group(1))
    print("捕獲的月份:", match.group(2))
    print("捕獲的日期:", match.group(3))

正則表達式是一種用于匹配字符串中字符組合的模式暖侨,廣泛應(yīng)用于文本處理、搜索和數(shù)據(jù)驗證等領(lǐng)域崇渗。以下是正則表達式的一些基礎(chǔ)用法和高級技巧的詳解:

基礎(chǔ)概念

  1. 字符匹配

    • 普通字符:直接匹配自身字逗,如a匹配字符a
    • 特殊字符:具有特殊含義宅广,如.匹配任意單個字符(除了換行符)葫掉。
  2. 字符類

    • 使用[]定義,匹配括號內(nèi)的任意一個字符跟狱,如[abc]匹配a俭厚、bc
    • 范圍表示法:如[a-z]匹配任意小寫字母驶臊。
  3. 重復(fù)

    • *:匹配前面的元素零次或多次挪挤。
    • +:匹配前面的元素一次或多次叼丑。
    • ?:匹配前面的元素零次或一次。
    • {n}:精確匹配n次扛门。
    • {n,}:至少匹配n次鸠信。
    • {n,m}:匹配n到m次。
  4. 位置指定

    • ^:匹配字符串的開始论寨。
    • $:匹配字符串的結(jié)束星立。
  5. 選擇

    • |:邏輯或操作符,如cat|dog匹配catdog葬凳。

高級用法

  1. 分組

    • 使用圓括號()創(chuàng)建捕獲組绰垂,允許你捕獲和引用匹配的文本片段。
  2. 量詞修飾符

    • *?火焰、+?劲装、??:非貪婪量詞,盡可能少地匹配字符荐健。
    • *+酱畅、++?+:占有量詞江场,不允許反向回溯纺酸。
  3. 斷言

    • (?:...):非捕獲組,用于組織模式但不捕獲文本址否。
    • (?=...):正向前瞻斷言餐蔬,確保某個位置后面能匹配某個模式。
    • (?!...):負向前瞻斷言佑附,確保某個位置后面不能匹配某個模式樊诺。
    • (?<=...):正向后瞻斷言,確保某個位置前面能匹配某個模式音同。
    • (?<!...):負向后瞻斷言词爬,確保某個位置前面不能匹配某個模式。
  4. 字符轉(zhuǎn)義

    • 使用反斜杠\轉(zhuǎn)義特殊字符或表示特殊序列权均,如\n表示換行符顿膨。
  5. 特殊序列

    • \d:匹配任意數(shù)字,等價于[0-9]叽赊。
    • \w:匹配任意字母數(shù)字字符恋沃,等價于[a-zA-Z0-9_]
    • \s:匹配任意空白字符必指。
  6. 編譯正則表達式

    • 使用re.compile()編譯正則表達式囊咏,提高效率,適用于多次使用同一模式。
  7. Python中的正則表達式函數(shù)

    • re.search():搜索字符串梅割,返回第一個匹配的對象霜第。
    • re.match():從字符串的開始位置匹配模式。
    • re.findall():找出字符串中所有匹配的子串户辞,并返回列表庶诡。
    • re.finditer():返回一個迭代器,每次迭代返回一個Match對象咆课。
    • re.sub():替換字符串中的匹配項。
    • re.split():根據(jù)匹配的模式分割字符串扯俱。

示例

import re

# 基礎(chǔ)匹配
pattern = r'\d+'
text = 'The year is 2023 and the temperature is 25 degrees.'
matches = re.findall(pattern, text)
print(matches)  # 輸出:['2023', '25']

# 使用捕獲組
pattern = r'(\d{4})-(\d{2})-(\d{2})'
text = 'Today is 2023-07-22.'
match = re.match(pattern, text)
if match:
    print(match.group(1))  # 輸出年份
    print(match.group(2))  # 輸出月份
    print(match.group(3))  # 輸出日期

# 非貪婪匹配
pattern = r'<.*?>'
text = '<div><p>Example</p></div>'
tags = re.findall(pattern, text)
print(tags)  # 輸出:['<div>', '<p>']

# 正向前瞻斷言
pattern = r'\b(?<=from)\w+\b'
text = 'Send the data from the server.'
matches = re.findall(pattern, text)
print(matches)  # 輸出:['server']

正則表達式是一種非常強大的工具书蚪,可以用于文本處理、數(shù)據(jù)清洗迅栅、網(wǎng)絡(luò)爬蟲等多種場景殊校,但也需要仔細設(shè)計以確保正確性和效率。應(yīng)根據(jù)具體需求選擇合適的模式和方法读存,掌握正則表達式的使用可以大大提高開發(fā)效率为流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市让簿,隨后出現(xiàn)的幾起案子敬察,更是在濱河造成了極大的恐慌,老刑警劉巖尔当,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莲祸,死亡現(xiàn)場離奇詭異,居然都是意外死亡椭迎,警方通過查閱死者的電腦和手機锐帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畜号,“玉大人缴阎,你說我怎么就攤上這事〖蛉恚” “怎么了蛮拔?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長替饿。 經(jīng)常有香客問我语泽,道長,這世上最難降的妖魔是什么视卢? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任踱卵,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惋砂。我一直安慰自己妒挎,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布西饵。 她就那樣靜靜地躺著酝掩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眷柔。 梳的紋絲不亂的頭發(fā)上期虾,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音驯嘱,去河邊找鬼镶苞。 笑死,一個胖子當著我的面吹牛鞠评,可吹牛的內(nèi)容都是我干的茂蚓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼剃幌,長吁一口氣:“原來是場噩夢啊……” “哼聋涨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起负乡,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤牍白,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抖棘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淹朋,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年钉答,在試婚紗的時候發(fā)現(xiàn)自己被綠了础芍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡数尿,死狀恐怖仑性,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情右蹦,我是刑警寧澤诊杆,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站何陆,受9級特大地震影響晨汹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贷盲,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一淘这、第九天 我趴在偏房一處隱蔽的房頂上張望剥扣。 院中可真熱鬧,春花似錦铝穷、人聲如沸钠怯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晦炊。三九已至,卻和暖如春宁脊,著一層夾襖步出監(jiān)牢的瞬間断国,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工榆苞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留并思,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓语稠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弄砍。 傳聞我的和親對象是個殘疾皇子仙畦,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容