正則學習(二)

pattern正則表達式對象的屬性、方法 Pattern正則表達式對象是一個編譯好的正則表達式對象,通過re.compile()編譯後的結果 >>> dir(pattern) ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__ ', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '_ _lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] flags 屬性 表示編譯時候的匹配模式, re.compile(pattern[, flags]) flags 可選,表示匹配模式 re.I 忽略大寫寫 re.L 表示特殊字符集,\w, \W, \b, \B, \s, \S 依賴當前環境 re.M 多行模式 re.S 表示.(點)包括換行符\n在內的任意字符 re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫 re.X 爲了增加可讀性,忽略空格和#後面的註釋 >>> p = re.compile(r"(\w+)(\w+)(?P<sign>.*)",re.S) >>> print(p.flags) 48 groups 屬性 返回正則表達式對象的分組數量 >>> p = re.compile(r"(\w+)(\w+)(?P<sign>.*)",re.S) >>> p.groups 3 groupindex屬性 返回一個字典,鍵爲正則表達式中組的別名,值爲別名組對應的編號 >>> p = re.compile(r"(\w+)(\w+)(?P<sign>.*)",re.S) >>> print(p.groupindex) {'sign': 3} pattern.match()方法 從字符串起始位置匹配正則表達式,匹配成功返回正則匹配對象,匹配失敗返回None,如果指定開始、結束匹配位置,則從開始位置匹配,結束位置結束匹配 語法: pattern.match(string,pos,end) String 爲要匹配的字符串 pos 匹配的起始位置,從0開始,可選 endpos 匹配的結束位置,開區間,可選 >>> pattern = re.compile(r"\d{3}\s+\w+") >>> pattern.match("123\nabcXYZ_098 ddd").group() '123\nabcXYZ_098' 指定匹配範圍 >>> pattern.match("123\nabcXYZ_098 ddd",1).group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> pattern = re.compile(r"\d+") >>> pattern.match("ab123db2",2) <_sre.SRE_Match object; span=(2, 5), match='123'> >>> pattern.match("ab123db2",2).group() '123' pattern. search()方法 在字符串中搜索匹配內容,如果匹配成功返回正則匹配對象,匹配失敗返回None,如果指定開始、結束匹配位置,在開始、結束位置之間進行搜索匹配; 語法: Pattern.search(string,pos,end) String 爲要匹配的字符串 pos 匹配的起始位置,從0開始,可選 End 匹配的結束位置,可選 >>> pattern = re.compile(r"\d{3}") >>> pattern.search("123abc456dd") <_sre.SRE_Match object; span=(0, 3), match='123'> >>> pattern.search("123abc456dd").group() '123' 指定匹配範圍 >>> pattern.search("123abc456dd",5).group() '456' Pattern.findall()方法 findall 查找字符串中所有能匹配的字符,把匹配的內容存入列表,並返回一個匹配字符的列表;列表內容類型都是字符串 返回的列表中的內容,取決於正則表達式中圓括號的出現情況,也就是分組的情況 語法: pattern.findall(string,pos,end) String 爲要匹配的字符串 pos 匹配的起始位置,從0開始,可選 endpos 匹配的結束位置,可選 1、當正則表達式中沒有圓括號(分組)時候,返回所有匹配的內容存入列表 >>> pattern = re.compile(r"\w+") >>> pattern.findall("1!2a XY\n AB") ['1', '2a', 'XY', 'AB'] 指定匹配範圍 >>> pattern = re.compile(r"\w+") >>> pattern.findall("1!2a XY\n AB",1,4) ['2a'] 2、當正則表達式中只帶有一個圓括號時,返回的列表的元素由所有能成功匹配表達式中圓括號匹配的內容組成,並且該列表中的元素都是字符串,它的內容與括號中的正則表達式相對應。(注意:列表中的字符串只是圓括號中的內容,不是整個正則表達式所匹配的內容。) >>> pattern = re.compile(r"\w(\d+)") >>> pattern.findall("ab12_34") ['12', '34'] >>> pattern = re.compile(r"(a)b") >>> pattern.findall("abc abc") ['a', 'a'] #此處結果只返回了分組(a)匹配的內容 3、當正則表達式中含有多個圓括號()時,返回列表中的元素由所有滿足匹配的內容組成,但是每個元素都是由表達式中所有圓括號匹配的內容組成的元組。而且元組中元素個數與括號對數相同,並且字符串排放順序跟括號出現的順序一致(一般看左括號‘ (’就行),字符串內容與每個括號內的正則表達式相對應 首先返回的是一個列表,列表的元素是元組,每個元組元素是對應分組匹配的內容,元組個數等於分組的個數; >>> pattern = re.compile(r"(a)b(c)") >>> pattern.findall("abc abc") [('a', 'c'), ('a', 'c')] >>> pattern = re.compile(r"(\w+)!(\d+)") >>> pattern.findall("A!1B!2c!3") [('A', '1'), ('B', '2'), ('c', '3')] >>> pattern = re.compile(r"((\w+)!(\d+))")#有三個分組 >>> pattern.findall("A!1B!2c!3") [('A!1', 'A', '1'), ('B!2', 'B', '2'), ('c!3', 'c', '3')] >>> add = 'https://www.net.com.edu//action=?asdfsd and other https://www.baidu.com//a=b' >>> pattern = re.compile(r"((w{3}\.)(\w+\.)+(edu|com|cn|org))")#有4個分組 >>> pattern.findall(add) [('www.net.com.edu', 'www.', 'com.', 'edu'), ('www.baidu.com', 'www.', 'baidu.', 'com')] Pattern.finditer()方法 匹配字符串中所有滿足條件的子串,返回一個迭代器,迭代器裏面的存儲的是每一個匹配結果的匹配對象,這樣可以節省空間 語法: pattern.finditer(string,pos,end) String 爲要匹配的字符串 pos 匹配的起始位置,從0開始,可選 End 匹配的結束位置,可選 >>> for m in pattern.finditer("12a34b56c90"): ... print(m.group()) ... 12 34 56 90 >>> pattern = re.compile(r"[a-z]+",re.I) >>> [m.group() for m in pattern.finditer("one1two2three3four4")] ['one', 'two', 'three', 'four'] 其中的每個m都是正則匹配對象,可以調用group() pattern.split 方法 把需要匹配的字符串按照正則表達式匹配的結果爲分割符進行分割,並返回分割後的列表 語法: Pattern.split(string [,maxsplit]) 參數說明: string:被匹配的字符串 maxsplit:用於指定最大分割次數,可選,默認爲0,表示全部分割。 >>> pattern = re.compile("\d+") >>> pattern.split("one1two2three3four4five") ['one', 'two', 'three', 'four', 'five'] Pattern.sub方法 使用repl替換string中每一個匹配的子串後返回替換後的字符串。 當repl是一個字符串時,可以使用\id或\g<id>、\g<name>引用分組,但不能使用編號0。 當repl是一個方法時,它必須傳一個Match對象,並必須返回一個字符串用於替換(返回的字符串中不能再引用分組) 語法: pattern.sub(repl, string[, count = 0]) 參數說明: repl:用於替換的字符串 string:要被替換的字符串 count:替換的次數,如果爲0表示替換所有匹配到的字串,如果是1表示替換1次,爲2替換2次等,該參數必須是非負整數,默認爲0。 >>> pattern = re.compile(r"\d+") >>> pattern.sub("x","a1b2c3d4")#將"a1b2c3d4"中的數字替換成x 'axbxcxdx' 利用函數: >>> pattern = re.compile(r"\d+") >>> def dtoc(m): ... return "X" ... >>> pattern.sub(dtoc,"a1b2c3") 'aXbXcX' 執行過程:在字符串"a1b2c3"中搜索並匹配對應的數字,得到正則匹配對象,然後傳入函數dtoc中,根據函數返回的結果替換"a1b2c3"中的數字內容爲X >>> s = 'i say, hello world!' >>> pattern = re.compile(r"(\w+) (\w+)") >>> pattern.sub(r"\2 \1",s)#把字符串替換成對應分組匹配的內容 'say i, world hello!' >>> s = 'i say, hello world!' >>> pattern = re.compile(r"(\w+) (\w+)") >>> def func(m): ... return m.group(1).title() + " "+ m.group(2).title() ... >>> pattern.sub(func,s) 'I Say, Hello World!' #根據正則表達式對象匹配字符串中的對應字符,得到正則匹配對象傳入函數,根據函數得到的結果,替換字符串中的匹配內容; Pattern.subn函數 語法: Pattern.subn(repl,string,[,count = 0]) 參數說明: repl:用於替換的字符串 string:要被替換的字符串 count:替換的次數,如果爲0表示替換所有匹配到的字串,如果是1表示替換1次,爲2替換2次等,該參數必須是非負整數,默認爲0。 這個函數跟sub函數用法差不多,只是它有一個額外的特徵,結果是返回一個tuple,tuple第一個元素是替換後的新字符串,第二個元素是替換的次數 >>> pattern = re.compile(r"") >>> pattern = re.compile(r"\d+") >>> pattern.subn("xxx","1a2b3c") ('xxxaxxxbxxxc', 3)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章