NLP_Python3——正則表達式

之前有轉載過一篇專門講解正則表達式的博客(https://blog.csdn.net/u013032852/article/details/81506431),裏面詳細的描述了正則表達式的組成,最少入門應該是夠了,畢竟那種高大上的正則表達式不是隨便看兩篇帖子就能學會的,還是要靠自己的活學活用及日常積累(反正我日常用到比較少,畢竟我的工作內容老是換來換去的···一般都是用到的時候過來查一下╮(╯_╰)╭),建議只做NLP的童鞋好好研究學習一下正則表達式,正則用好了可以省很多事的~~這裏就簡單的講述下在python3中怎麼去使用正則表達式。

在Python中是通過re模塊來運用正則表達式的,使用步驟一般如下:

  1. 根據需要組裝正則表達式
  2. 將表單時的字符串賦給Pattern實例
  3. 使用Pattern實例處理文本來獲取匹配內容
  4. 從匹配的內容中獲取想要的信息進行後續其他操作
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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章