re:模塊

模塊的引用

import re正則表達式

  :爲.py文件取名時不能與模塊的名字相同spa

re模塊中的查找

findall

匹配全部條件相匹配,每一項都是列表中的元素code

import re
ret = re.findall(r"\d+", "大123家78好!")
print(ret)
運行結果:
['123', '78']

search

匹配從左到右的第一個結果,獲得的是一個變量,經過這個變量的group()方法來獲結果blog

ret = re.search(r"\d+", "大123家78好!")
print(ret)
print(ret.group())
運行結果:
<_sre.SRE_Match object; span=(1, 4), match='123'>
123

須要注意的是如果沒有匹配結果,就會報錯,所以經常使用if作判斷,再進行打印內存

ret = re.search(r"\d+", "大123家78好!")
if ret:
    print(ret.group())

match

從頭開始匹配,至關於search的正則表達式的開頭加入  ^  規則rem

ret = re.match(r"\d+", "大123家78好!")
print(ret)
ret = re.match(r"\d+", "123家78好!")
print(ret)
print(ret.group())
運行結果:
None
<_sre.SRE_Match object; span=(0, 3), match='123'>
123

re模塊中的切割與替換

split

與字符串的切割相似,切割條件去除,且以切割條件結尾的話會,結果中會出現一個空(" ")字符串

ret = re.split(r"\d+", "大123家78好!")
print(ret)
ret = re.split(r"\d+", "大123家78好!9")
print(ret)
運行結果:
['', '', '好!']
['', '', '好!', '']

sub與subnit

sub("正則a","b","內容",n)編譯

subn("正則a","b","內容")class

sub與subn幾乎相同,只是subn能夠現出替換的次數,

用法是:將規則a的匹配內容換成b,n是想要替換的次數

ret = re.sub(r"\d+", "!", "大123家78好")
print(ret)
ret = re.subn(r"\d+", "!", "大123家78好")
print(ret)
ret = re.sub(r"\d+", "!", "大123家78好", 1)
print(ret)
運行結果:
大!家!好
('大!家!好', 2)
大!家78好

compile節省時間

compile能夠節省使用正則表達式解決問題的時間,她是將正則表達式編譯成字節碼,這樣在屢次使用時就不須要屢次編譯了.

ret = re.compile(r"\d+")
print(ret)
print(ret.findall("大123家78好!"))
print(ret.search("大123家78好!").group())
運行結果:
re.compile('\\d+')
['123', '78']
123

finditer節省空間

能夠節省使用正則表達式時所佔用的內存

finditer返回一個迭代器,全部的結果都在這個迭代器中,須要經過循環+group的形式取值所以可以節省內存

ret = re.finditer(r"\d+", "大123家78好!")
print(ret)
for i in ret:
    print(i.group())
運行結果:
<callable_iterator object at 0x000000000256EFD0>
123
78

分組在re模塊中的應用

findall分組

findall爲了能夠順利取到分組中的內容,有一個特殊的語法,就是優先顯示分組中的內容

s = '<a>wahaha</a>'
ret = re.findall(r">\w+<", s)
print(ret)
ret = re.findall(r">(\w+)<", s)
print(ret)
運行結果:
['>wahaha<']
['wahaha']

?:正則表達式能夠取消分組優先

ret = re.findall(r"\d(.\d+)?", "1.23*4")
print(ret)
ret = re.findall(r"\d(?:.\d+)?", "1.23*4")
print(ret)
運行結果:
['.23', '']
['1.23', '4']

search分組

group()中數字參數表明的是取對應分組中的內容,不加參數默認爲0表明的是所有匹配的內容

s = '<a>wahaha</a>'
set = re.search(r"<(\w+)>"r"(\w+)"r"</(\w+)>", s)
print(set.group())
print(set.group(0))
print(set.group(1))
print(set.group(2))
print(set.group(3))
運行結果:
<a>wahaha</a>
<a>wahaha</a>
a
wahaha
a

split分組

split應用分組時會保留切割條件

ret = re.split('\d+', 'alex83taibai40egon25aa')
print(ret)
ret = re.split('(\d+)', 'alex83taibai40egon25aa')
print(ret)
運行結果:
['alex', 'taibai', 'egon', 'aa']
['alex', '83', 'taibai', '40', 'egon', '25', 'aa']

分組命名

?P<這個組的名字>正則表達式

s = '<a>wahaha</a>'
ret = re.search('>(?P<con>\w+)<', s)
print(ret.group(1))
print(ret.group('con'))
運行結果:
wahaha
wahaha

判斷標籤的頭尾是否一致

s = '<a>wahaha</a>'
pattern = '<(\w+)>(\w+)</(\w+)>'
ret = re.search(pattern, s)
print(ret.group(1) == ret.group(3))

# 使用前面的分組 要求使用這個名字的分組和前面同名分組中的內容匹配的必須一致
pattern_new = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
ret = re.search(pattern_new, s)
print(ret)

運行結果:
True
<_sre.SRE_Match object; span=(0, 13), match='<a>wahaha</a>'>
當所取的內容沒有太大的區分特色時容易和你不想匹配的內容混在一塊兒,可使用分組的優先取值
ret = re.findall(r"\d+", "1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
ret = re.findall(r"\d+\.\d+|(\d+)", "1-2*(60+(-40.35/5)-(-4*3))")
ret.remove('')
print(ret)
運行結果:
['1', '2', '60', '40', '35', '5', '4', '3']
['1', '2', '60', '5', '4', '3']
相關文章
相關標籤/搜索