之前有轉載過一篇專門講解正則表達式的博客(https://blog.csdn.net/u013032852/article/details/81506431),裏面詳細的描述了正則表達式的組成,最少入門應該是夠了,畢竟那種高大上的正則表達式不是隨便看兩篇帖子就能學會的,還是要靠自己的活學活用及日常積累(反正我日常用到比較少,畢竟我的工作內容老是換來換去的···一般都是用到的時候過來查一下╮(╯_╰)╭),建議只做NLP的童鞋好好研究學習一下正則表達式,正則用好了可以省很多事的~~這裏就簡單的講述下在python3中怎麼去使用正則表達式。
在Python中是通過re模塊來運用正則表達式的,使用步驟一般如下:
- 根據需要組裝正則表達式
- 將表單時的字符串賦給Pattern實例
- 使用Pattern實例處理文本來獲取匹配內容
- 從匹配的內容中獲取想要的信息進行後續其他操作
import re
#在正則表達式前面加r的目的是避免因爲轉義'\'導致的問題,如r'\d'等同於'\\d'
pattern = re.compile(r'[\d\w]*') # 將正則表達式(匹配數字和字符)賦給Pattern實例
match = pattern.match('ak,i.uop3umok2345234sdfj') #使用Pattern實例處理文本獲取匹配內容
if match:
print(match.groups())
**************
輸出結果:ak
re.compile(pattern, flags=0):函數是Pattern類的工廠方法(不瞭解什麼是工廠方法的可以自己去搜一下設計模式,當然知道與否對學會怎麼使用這個函數是沒有影響的),用於將字符串形式的正則表達式編譯爲Pattern對象;flags參數用於指定匹配模式,多個匹配模式可以用按位或運算符“|”連接,比如re.I|re.M,flags枚舉值如下:
A = ASCII = sre_compile.SRE_FLAG_ASCII # assume ascii "locale",使預定義字符類\w\W\b\B\s\S取決於ascii定義的字符屬性 I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case,忽略大小寫 L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale,使預定義字符類\w\W\b\B\s\S取決於當前環境 U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode "locale",使預定義字符類\w\W\b\B\s\S取決於unicode定義的字符屬性 M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline,多行模式,改變'^'和'$'的行爲 S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline,改變'.'的行爲 X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments,在此模式下正則表達式可以是多行、忽略空白字符、可以加入註釋
pattern.match(str) or re.match(pattern,str,flags):從字符串起始位置開始匹配str中是否有符合pattern的字符串,如果起始位置沒有匹配成功則返回None,其中re.match的pattern參數可以直接爲正則表達式字符串,如果直接使用正則表達式字符串注意不要忘記轉義(加r)哈;使用此方法後返回一個match實例,此實例有以下屬性與方法:
string:匹配對象,就是原文本
re:匹配時使用的Pattern
pos:文本中正則表達式開始搜索的起始索引
endpos:文本中正則表達式結束搜索的索引
lastindex:最後一個被捕獲的group在文中的索引,若捕獲失敗則返回None
lastgroup:最後一個被捕獲的group的別名,若捕獲失敗或此group沒有別名則返回None
group([0,1,2```]):捕獲1個或多個group,參數可以爲別名也可以爲編號,其中編號0或不傳參代表所有匹配的group;指定多個參數時返回元組結果
groups([args]):以元組形式返回截獲的所有分組,相當於調用group(1,2```n)。args表示沒有捕獲group時返回args,默認爲None
groupdict([agrs]) :返回以一個用別名爲key,group爲值的字典,沒有別名的group不在其中,args表示沒有捕獲group時返回args,默認爲None
start([group]):返回指定group在原文中的起始索引(group第一個字符的索引),group默認值爲0
end([group]):返回指定的group在原文中的結束索引(group最後一個字符的索引+1),group默認值爲0
span([group]):返回(start(group),end(group))
expand(template):將匹配到的分組代入template中然後返回。template中可以使用\id或\g<id>、 \g<name>引用分組,但不能使用編號0。\id與\g<id>是等價的;但\10將被認爲是第10個分組,如果你想表達 \1之後是字符'0',只能使用\g<1>0
import re
m = re.match(r'(\w*)[, ;](\w*)', 'asdf,fda3e opwerl;o9weoir')
print('m.string', m.string)
print('m.re', m.re)
print('m.pos', m.pos)
print('m.endpos', m.endpos)
print('m.lastindex', m.lastindex)
print('m.lastgroup', m.lastgroup)
print('m.group(1,2)', m.group(1, 2))
print('m.groups()', m.groups())
print('m.start(2)', m.start(2))
print('m.end(2)', m.end(2))
print('m.span(2)', m.span(2))
print("m.expand(r'\2 \1')", m.expand(r'\2 \1'))
************************************************
輸出結果:
m.string asdf,fda3e opwerl;o9weoir
m.re re.compile('(\\w*)[, ;](\\w*)')
m.pos 0
m.endpos 25
m.lastindex 2
m.lastgroup None
m.group(1,2) ('asdf', 'fda3e')
m.groups() ('asdf', 'fda3e')
m.start(2) 5
m.end(2) 10
m.span(2) (5, 10)
m.expand(r'\2 \1') fda3e asdf
pattern.search(str,pos,endpos) or re.search(pattern,string,flags): 從原文的pos下標開始到endpos下標結束嘗試匹配group,pos和endpos參數默認爲原文起始及結束位置。與match的區別在於search可以從文中進行匹配,而match只能從起始位置開始匹配
pattern.split(string,maxsplit) or re.split(pattern,string,maxsplit):將能夠匹配到的group做爲分隔符將原文分割後以列表返回,maxsplit指定最大分割次數,默認爲全部分割
import re
pattern = re.compile(r'\W+')
strs = pattern.split('aki.uop3umok2,345234s/dfj') #使用Pattern實例處理文本獲取匹配內容
print(strs)
****************************
輸出結果:
['aki', 'uop3umok2', '345234s', 'dfj']
pattern.findall(string,pos,endpos) or re.findall(pattern,string,flags):從原文中搜索匹配,將所有能匹配的group以列表形式返回
import re
pattern = re.compile(r'\w+')
strs = pattern.findall('aki.uop3umok2,345234s/dfj')
print(strs)
*****************************
輸出結果:
['aki', 'uop3umok2', '345234s', 'dfj']
pattern.sub( repl, string, count=0) or sub(pattern, repl, string, count=0, flags=0):使用repl替換string中匹配的group並返回替換後的字符串,其中repl可以爲字符串,也可以爲方法;當repl是一個字符串時,可以使用\id或\g<id>、 \g<name>引用分組,但不能使用編號0;當repl是一個方法是,這個方法應該只接受一個參數(match對象),並返回一個字符串用於替換;count用於指定最多替換次數,默認爲全部替換
import re
def sub_match(m):
return m.group(1) + ":" + m.group(2)
pattern = re.compile(r'(\d+).(\d+)')
strs = pattern.sub('NUM', 'aki.uop3umok2,345234s/dfj')
print(strs)
strs = pattern.sub(r'\1:\2', 'aki.uop3umok2,345234s/dfj')
print(strs)
strs = pattern.sub(sub_match, 'aki.uop3umok2,345234s/dfj')
print(strs)
********************************
輸出結果爲:
aki.uop3umokNUMs/dfj
aki.uop3umok2:345234s/dfj
aki.uop3umok2:345234s/dfj