python3 正则表达式模块re相关
生活随笔
收集整理的這篇文章主要介紹了
python3 正则表达式模块re相关
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
# -*- coding:utf-8 -*-
# Author: Evan Mi
import re
"""
'.' 默認(rèn)匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行
'^' 匹配字符開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符結(jié)尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*號前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 結(jié)果為['abb', 'ab', 'a']
'+' 匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結(jié)果['ab', 'abb']
'?' 匹配前一個字符1次或0次
'{m}' 匹配前一個字符m次
'{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結(jié)果['abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結(jié)果'ABC'
'(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結(jié)果 abcabca456c'\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符結(jié)尾,同$
'\d' 匹配數(shù)字0-9
'\D' 匹配非數(shù)字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結(jié)果 '\t'
'(?P<name>...)' 分組匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})",
"371481199306143242").groupdict("city")結(jié)果{'province': '3714', 'city': '81', 'birthday': '1993'}最常用的匹配語法
re.match 從頭開始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回string="abcdefg acbdgef abcdgfe cadbgfe"regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#輸出:[('abcdefg acbdgef', 'abcdefg'), ('abcdgfe cadbgfe', 'abcdgfe')]
解釋一下為什么這樣的結(jié)果?很簡單,當(dāng)我們忽略括號,對整個字符串進(jìn)行匹配的時候,要求是一到多個字母空格一到多個字母;
所以有兩個結(jié)果'abcdefg acbdgef'和'abcdgfe cadbgfe',但是我們是有括號的,所以給結(jié)果也加上括號,結(jié)果就變成了
'((abcdefg) acbdgef)'和'((abcdgfe) cadbgfe)',然而findall要返回括號里面的內(nèi)容,而我們這里匹配了兩次,每次有兩個括號,
所以只好把每次的兩個括號放在一個tuple中來區(qū)別哪此匹配的,tuple中的內(nèi)容就是兩個括號中的值;所以結(jié)果為:
[('abcdefg acbdgef', 'abcdefg'), ('abcdgfe cadbgfe', 'abcdgfe')]regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#輸出:['abcdefg', 'abcdgfe']
解釋一下為什么這樣的結(jié)果?很簡單,當(dāng)我們忽略括號,對整個字符串進(jìn)行匹配的時候,要求是一到多個字母空格一到多個字母;
所以有兩個結(jié)果'abcdefg acbdgef'和'abcdgfe cadbgfe',但是我們是有括號的,所以給結(jié)果也加上括號,結(jié)果就變成了
'(abcdefg) acbdgef'和'(abcdgfe) cadbgfe',然而findall只返回括號里面的內(nèi)容,所以結(jié)果是
['abcdefg','abcdgfe']regex2=re.compile("\w+\s+\w+")
print(regex2.findall(string))
#輸出:['abcdefg acbdgef', 'abcdgfe cadbgfe']
解釋一下,這個沒有括號了,兩次匹配到的結(jié)果就是'abcdefg acbdgef'和'abcdgfe cadbgfe';沒有括號,就在最外層默認(rèn)加個括號,
變成了'(abcdefg acbdgef)'和'(abcdgfe cadbgfe)';所以結(jié)果是
['abcdefg acbdgef', 'abcdgfe cadbgfe'];findall()返回的是括號所匹配到的結(jié)果(如regex1),多個括號就會返回多個括號分別匹配到的結(jié)果(如regex),
如果沒有括號就返回就返回整條語句所匹配到的結(jié)果(如regex2)。所以在提取數(shù)據(jù)的時候就需要注意這個坑print(re.sub('(.)\\1*', "2", test)) \1是代表第一個括號中的值
print(re.findall('(.)\\1*', test))
re.split 以匹配到的字符當(dāng)做列表分隔符
re.sub 匹配字符并替換
"""
總結(jié)
以上是生活随笔為你收集整理的python3 正则表达式模块re相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯第五届省赛JAVA真题----最长
- 下一篇: 用ibatis.net简单的数据更新