python正則匹配


在python中使用正則表達式

一、搜索和查找與正則相匹配的內容

1、re.compile的用法

compile(pattern, flags=0)把正則表達式編譯為正則表達式對象

一個正則表達式的例子,從字符串string中找字符“the”出現的次數,不區分大小寫:

#!/usr/bin/env python3
#正則表達式與模式匹配
import re
string="The quick brown fox jumps over the lazy dog."
string_list=string.split()
pattern=re.compile(r"The",re.I)
#re.compile函數將文本形式的模式編譯成編譯后的正則表達式(即正則表達式的編譯)。
#r不是必須的,但是在正則表達式中使用原始字符串是一個好習慣
#re.I函數確保模式不區分大小寫。
count=0
for word in string_list:
    if pattern.search(word):
        print(pattern.search(word).string)
        count+=1
print("The出現的次數:{0:d}".format(count))

結果:

The
the
The出現的次數:2

2、re.search()

search(pattern, string, flags=0)返回第一個匹配到的對象,可以調用這個對象的 group()方法返回第一個匹配到的值。沒有匹配上返回None。

查找第一次出現字母的對象:

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
res1 = re.search(r'[a-z]+', r'jiem098mib562qwe678')
print('search', res1)
print(res1.group())

結果:

search <re.Match object; span=(0, 4), match='jiem'>
jiem

3、re.match()

match(pattern, string, flags=0)和search用法一樣,唯一區別就是只在字符串開始匹配

使用re.match方法,查找以185開頭的電話號碼

#!/usr/bin/env python3
#正則表達式與模式匹配
#re.match的使用
import re
string = "18512349553;18256785181;13698762112;18654320816;18511113141"
string_list = string.split(';')
count = 1
for word in string_list:
    ret = re.match(r"^185\d{8}$", word)
    if ret:
        print("第"+str(count)+"個位置可以匹配,匹配結果是:"+ ret.string)
    else:
        print("第"+str(count)+"個位置不能匹配")
    count+=1

結果:

第1個位置可以匹配,匹配結果是:18512349553
第2個位置不能匹配
第3個位置不能匹配
第4個位置不能匹配
第5個位置可以匹配,匹配結果是:18511113141

4、re.findall()

findall(pattern, string, flags=0)所有的匹配結果都返回在一個列表中,如果沒有匹配上就返回一個空列表.

使用re.findall的方法。

將數字取出:

#!/usr/bin/env python3
#正則表達式與模式匹配:re.findall

import re
string="a list of groups; this is not 123 and 456"
res = re.findall(r'[0-9]+', string)
print(res)

結果:

['123', '456']

 5、finditer()

finditer(pattern, string, flags=0)根據正則表達式匹配字符串得到 一個迭代器,迭代器中每個元素都是一個對象,每個對象都可通過 group()方法獲取對應的匹配值。(查找)

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
string="928jkh568isd123hde547vcx"
res = re.finditer(r'\d+', string)
print(res)
for each in res:
    print(each)

結果:

<callable_iterator object at 0x000001D185AF8128>
<re.Match object; span=(0, 3), match='928'>
<re.Match object; span=(6, 9), match='568'>
<re.Match object; span=(12, 15), match='123'>
<re.Match object; span=(18, 21), match='547'>

 

二、切割和替換與正則相匹配的內容

1、sub()

sub(pattern, repl, string, count=0, flags=0)根據(pattern)正則表達式規則將匹配好的字符串替換為新字符串(repl),string為目標串,count可以指定替換次數

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
string="928jkh568isd123hde547vcx"
res = re.sub(r'\D+', 'AAA',string)
#\D匹配任何一個非數字字符
print(res)

 結果:

928AAA568AAA123AAA547AAA

只替換前兩次匹配的結果:

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
string="928jkh568isd123hde547vcx"
res = re.sub(r'\D+', 'AAA',string,2)
#\D匹配任何一個非數字字符
print(res)

結果:

928AAA568AAA123hde547vcx

2、subn()

subn(pattern, repl, string, count=0, flags=0)根據(pattern)正則表達式規則將匹配好的字符串替換為新字符串(repl),string為目標串,count可以指定替換次數.
返回的結果是元組,其中有替換結果和替換次數

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
string="928jkh568isd123hde547vcx"
res = re.subn(r'\D+', 'AAA',string)
#\D匹配任何一個非數字字符
print(res)

結果:

('928AAA568AAA123AAA547AAA', 4)

將匹配次數設置為3,則:

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
string="928jkh568isd123hde547vcx"
res = re.subn(r'\D+', 'AAA',string,3)
#\D匹配任何一個非數字字符
print(res)

結果:

('928AAA568AAA123AAA547vcx', 3)

3、split()

split(pattern, string, maxsplit=0, flags=0)按照正則表達式匹配好的字符串去切割目標字符串,匹配對的結果會先拿第一個結果切割目標串,
切割完后拿第二個結果切割這兩個字符串,以此類推。可以指定最大切割次數,返回一個列表。

以數字分割該字符串:

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
string="928jkh568isd123hde547vcx"
res = re.split(r'\d+', string)
#\d匹配任何一個數字字符
print(res)

結果:

['', 'jkh', 'isd', 'hde', 'vcx']

 

最后展示一個這些函數應用的示例:

#!/usr/bin/env python3
#正則表達式與模式匹配

import re
string="<a>我愛你</a><h1>我恨你</h1>"
res1 = re.split(r'<[\/]?[a]>', string)
#<[\/]?[a]>為匹配尖括號里的a或反斜杠a
print(res1[1])
print("…………")
res2 = re.finditer(r'<[\/]?[0-9a-z]+>', string)
#<[\/]?[0-9a-z]+>為匹配尖括號里的字母數字或反斜杠的正則
for each in res2:
    print(each.group())
print("…………")
res3 = re.findall(r'<[\/]?[0-9a-z]+>', string)
print(res3)
print("…………")
res4 = re.search(r'<\w+>(?P<oo>\D+)</\w+><\w+>(?P<nn>\D+)</\w+>',string)
print(res4.group('oo'))
print(res4.group('nn'))
print("…………")
res5 = re.search(r'<(?P<tt>\w+)>(?P<cc>\w+)</\w+>', r'<a>hello</h1><a>hello</a>')
print(res5.group('tt'))
print(res5.group('cc'))
print(res5.group())

結果:

我愛你
…………
<a>
</a>
<h1>
</h1>
…………
['<a>', '</a>', '<h1>', '</h1>']
…………
我愛你
我恨你
…………
a
hello
<a>hello</h1>

 

原文鏈接:https://www.cnblogs.com/xiao-xue-di/p/9438165.html

 


免責聲明!

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



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