整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Python 爬蟲正則表達式和re庫,及re庫的基本

          Python 爬蟲正則表達式和re庫,及re庫的基本使用,提取單頁面信息

          、正則表達式

          正則表達式是處理字符串的強大工具,它有自己特定的語法結構,有了它,實現字符串的檢索、替換、匹配驗證都不在話下,正則表達式在所有編程里通用,所以不僅僅是python使用。

          以下是常用的正則表達式,用的時候參考即可,不需要死記硬背,用得多了自然就熟悉了。

          • d :匹配任意數字,等價于 [0-9]
          • D :匹配任意非數字的字符,d的取反
          • w:代表字母,數字,下劃線。也就是 a-z、A-Z、0-9、_。
          • W:代表不是字母,不是數字,不是下劃線的。w的取反
          • n:代表一個換行
          • r :代表一個回車
          • f :代表換頁
          • t :代表一個 Tab
          • s:代表所有的空白字符,也就是上面這個:n、r、t、f
          • S:代表所有不是空白的字符,s的取反
          • A :代表字符串的開始
          • Z:代表字符串的結束
          • ^ :匹配字符串開始的位置
          • $ :匹配字符串結束的位置
          • . :代表所有的單個字符,除了 n r
          • [...] :代表在 [] 范圍內的字符,比如 [a-z] 就代表 a到z的字母
          • [^...] :代表不在 [] 范圍內的字符 ,[...] 的取反
          • {n} :匹配在 {n} 前面的東西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的兩個o
          • {n,m} :匹配在 {n,m} 前面的東西,比如:o{1,3} 將匹配“fooooood”中的前三個o
          • {n,} :匹配在 {n,} 前面的東西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o
          • * :和 {0,} 一個樣,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”
          • + :和{1,} 一個樣,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”
          • ? :和{0,1} 一個樣,匹配 ?前面 0 次或 1 次
          • a|b :匹配 a 或者 b
          • ():匹配括號里面的內容

          1、python爬蟲最常用組合

          死記硬背,估計很難記住,很多人就不想學了。但是只要記住最常用的組合即可。

          .*? 是我們在匹配過程中最常使用到的,表示的就是匹配任意字符。

          \d+ 匹配任意數字組合。

          上面的 .*? 為什么不直接用 .* 而需要加個 ,這個涉及到貪婪還是非貪婪匹配。

          2、貪婪還是非貪婪匹配

          貪婪匹配:就是我們的第一段代碼,一個數一個數都要去匹配,會盡可能多地去匹配內容。

          非貪婪匹配:會盡量少的匹配符合條件的內容 也就是說,一旦發現匹配符合要求,立馬就匹配成功,而不會繼續匹配下去。

          例子:

          aacbacbc 用 a.*b 貪婪匹配的內容是:aacbacb
          aacbacbc 用 a.*?b 非貪婪匹配的內容是:aacb


          二、Python的Re庫

          Python語言中的re模塊擁有全部的正則表達式功能。

          1、re.match函數

          函數語法:

          re.match(pattern, string, flags=0)
          
          pattern: 模式字符串 string:要匹配的字符串 flags:可選參數,比如re.I 不區分大小寫

          匹配成功re.match方法返回一個匹配的對象,否則返回None。

          示例:

          import re
          print(re.match('ywbj', 'ywbj.cc')) # 在起始位置匹配
          print(re.match('ywbj', 'ywbj.cc').span()) # 在起始位置匹配
          print(re.match('ywbj', 'www.ywbj.cc')) # 不在起始位置匹配

          執行結果:

          <re.Match object; span=(0, 4), match='ywbj'>                                                                                                                                                             
          (0, 4)                                                                          
          3 None

          從例子中我們可以看出,re.match()方法返回一個匹配的對象,而不是匹配的內容。

          通過調用span()可以獲得匹配結果的位置。

          而如果從起始位置開始沒有匹配成功,即便其他部分包含需要匹配的內容,re.match()也會返回None。

          2、分組捕獲

          以上可以看到返回的是匹配的對象,不是匹配的內容。

          需要獲取匹配的內容,我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。

          一般一個小括號括起來就是一個捕獲組。我們可以使用group()來提取每組匹配到的字符串。

          • group(num=0): 匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
          • groups(): 返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。

          示例:

          import re
          
          content="I have 100 dogs and cats"
          res=re.match('^I.*?(\d+)(.*?)and(.*?)$',content)
          print(res.group())
          print(res.groups())
          print(res.group(1))
          print(res.group(2))
          print(res.group(3))

          執行結果:

          I have 100 dogs and cats                                                                                                                                                                                 
          ('100', ' dogs ', ' cats')                                                      
          100                                                                             
           dogs                                                                           
           cats 

          以上成功通過group捕獲需要的詞組和內容。

          3、re.search()函數

          re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。

          示例:

          import re
          
          content="I have 100 dogs and 200 cats"
          res=re.search('\d+',content)
          print(res.group())

          執行結果:

          100

          以上,如果用re.match則無法匹配,因為正則表達式不符合字符串規范,會報錯。

          而用re.search,直接匹配整個字符串。找到第一個符合 \d+ 的字符串100。

          注:僅僅是匹配第一個符合的,所以只有100,后面的200不會匹配。

          4、re.findall()函數

          re.search可以直接匹配找到符合正則的字符串,但是僅僅是**第一個**符合的。

          如果需要匹配全部的符合的,則用到re.findall()函數。

          re.findall()在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果有多個匹配模式,則返回元組列表,如果沒有找到匹配的,則返回空列表。

          示例:

          import re
          
          content="I have 100 dogs and 200 cats"
          res=re.findall('\d+',content)
          print(res)

          執行結果:

          ['100', '200']

          由于返回的是返回一個列表或元組,所以也不需要group來捕獲。如果需要一個一個捕獲,用res[0] 或res[1]來一個一個顯示捕獲的值。

          5:re.sub()函數

          檢索和替換,Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項。

          語法:

          re.sub(pattern, repl, string, count=0, flags=0)
          
          參數:
          pattern : 正則中的模式字符串。
          repl : 替換的字符串,也可為一個函數。
          string : 要被查找替換的原始字符串。
          count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。

          示例:

          import re
          
          content="I have 100 dogs and 200 cats"
          res=re.sub('\d+','300',content)
          print(res)

          執行結果:

          I have 300 dogs and 300 cats

          6:re.compile()函數

          這個主要就是把我們的匹配符封裝一下,這個也是很常用的一個函數。

          表達式:

          re.compile(pattern[, flags])

          參數:

          pattern : 一個字符串形式的正則表達式

          flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體參數為:

          • re.I 忽略大小寫
          • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當前環境
          • re.M 多行模式
          • re.S 即為 . 并且包括換行符在內的任意字符(. 不包括換行符)
          • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數據庫
          • re.X 為了增加可讀性,忽略空格和 # 后面的注釋

          示例:

          import re
          
          content="I have 100 dogs and cats"
          
          res=re.match('^I.*?(\d+)(.*?)and(.*?)$',content,re.S)
          
          print(res.group())
          print(res.groups())

          以上,我們可以先用re.compile把正則表達式封裝,便于以后反復使用。封裝后如下:

          import re
          
          content="I have 100 dogs and cats"
          
          pattern=re.compile('^I.*?(\d+)(.*?)and(.*?)$',re.S)
          res=re.match(pattern,content)
          
          print(res.group())
          print(res.groups())

          執行結果相同:

          I have 100 dogs and cats
          ('100', ' dogs ', ' cats')

          7、其他函數

          re.finditer,和 findall 類似,在字符串中找到正則表達式所匹配的所有子串,并把它們作為一個迭代器返回。

          import re
           
          it=re.finditer(r"\d+","12a32bc43jf3") 
          for match in it: 
              print (match.group() )

          輸出結果:

          12
          32
          43
          3

          re.split,split 方法按照能夠匹配的子串將字符串分割后返回列表。

          示例:

          import re
          
          pattern=re.compile(r"[A-Z]+")
          
          m=pattern.split("abcDefgHijkLmnoPqrs")
          
          print(m)

          執行結果

          ['abc', 'efg', 'ijk', 'mno', 'qrs']

          其他函數,具體用法可參考官方文檔:https://docs.python.org/zh-cn/3/library/re.html

          三、網頁中的正則提取

          1、正則表達式分析

          慣例,同樣以豆瓣電影排行做分析,鏈接為:https://movie.douban.com/top250

          查看源代碼,簡單點,我們提取4個信息即可。分別是排名序號、電影名稱、導演演員、年份類型。

          分析,所有信息在li標簽中,所以首尾用在 li 標簽中找就行了。需要的提取的信息,用()分組捕獲就行。

          1:第一個信息,排名序號,排名序號1在class></em之間。em是唯一的,比較簡單。

          <li.*?(\d+)</em.*?li>

          2:第二個信息,電影名稱,有很多地方,但是我們選個唯一明顯不重復的,alt=后面是標簽里唯一的,整個標簽里面就一個信息,所以這里比較簡單,這時正則表達式為。

          <li.*?(\d+)</em.*?alt="(.*?)".*?li>

          3:第三個信息,導演演員,在<p 標簽里面,br>標簽上方,這時正則表達式為。

          <li.*?(\d+)</em.*?alt="(.*?)".*?<p.*?">(.*?)<br>.*?li>

          4:第四個信息,年份類型,同理br>標簽后方,</p結束,這個也很明顯,最后的正則表達式為。

          <li.*?(\d+)</em.*?alt="(.*?)".*?<p.*?">(.*?)<br>(.*?)</p.*?li>

          2、頁面信息提取

          正則表達式完成后,基本完成一大半了。現在簡單提取相關信息。

          這里用到兩個庫,re庫正則表達式,和requests庫抓取頁面

          import requests
          import re
          
          headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.162 Safari/537.36'}
          url='https://movie.douban.com/top250'
          
          req=requests.get(url,headers=headers)
          
          html=req.text
          #print(req.text)
          
          pattern=re.compile('<li.*?(\d+)</em.*?alt="(.*?)".*?<p.*?">(.*?)<br>(.*?)</p.*?li>',re.S)
          items=re.findall(pattern,html)
          print(items)

          執行結果,返回一個列表,還有\n空格等,比較亂,類似如下:

          [('1', '肖申克的救贖', '\n                            導演: 弗蘭克·德拉邦特 Frank Darabont   主演: 蒂姆·羅賓斯 Tim Robbins ', '\n                            1994 / 美國 / 犯罪 劇情\n                        '), ('2', '霸王別姬', '\n                            導演: 陳凱歌 Kaige Chen   主演: 張國榮 Leslie Cheung ', '\n                            1993 / 中國大陸 中國香港 / 劇情 愛情 同性\n                        '), ('3', '阿甘正傳', '\n                            導演: 羅伯特·澤米吉斯 Robert Zemeckis   主演: 湯姆·漢克斯 Tom Hanks ', '\n                            1994 / 美國 / 劇情 愛情\n                        '), ('4', '泰坦尼克號', '\n 
          ...

          3、列表去\n空格

          為了整潔,我們先抓取列表第一個數據 即 items[0] ,并去掉\n和空格。

          列表去除\n,需要用到 strip() 函數, strip() 方法用于移除字符串頭尾指定的字符(默認為空格或換行符)或字符序列。但是該函數只支持字符串,不支持列表。所以需要用循環的方式。如下:

          new=[x.strip() for x in items[0] if x.strip()!='']

          最后更改后的代碼為:

          import requests
          import re
          
          headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.162 Safari/537.36'}
          url='https://movie.douban.com/top250'
          
          req=requests.get(url,headers=headers)
          
          html=req.text
          #print(req.text)
          
          pattern=re.compile('<li.*?(\d+)</em.*?alt="(.*?)".*?<p.*?">(.*?)<br>(.*?)</p.*?li>',re.S)
          items=re.findall(pattern,html)
          #print(items[0])
          
          new=[x.strip() for x in items[0] if x.strip()!='']
          
          print(new)

          執行結果這時候整潔多了:

          ['1', '肖申克的救贖', '導演: 弗蘭克·德拉邦特 Frank Darabont   主演: 蒂姆·羅賓斯 Tim Robbins', '1994 / 美國 / 犯罪 劇情']

          4、循環提前整個頁面信息

          以上只有第一個信息,整個頁面有很多信息,需要全部提取,并排列整齊,所以需要再次用到for循環,一列一列的顯示出來。

          最終代碼為:

          import requests
          import re
          
          headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.162 Safari/537.36'}
          url='https://movie.douban.com/top250'
          
          req=requests.get(url,headers=headers)
          
          html=req.text
          #print(req.text)
          
          #pattern=re.compile('<li.*?(\d+)</em.*?alt="(.*?)".*?</li>',re.S)
          pattern=re.compile('<li.*?(\d+)</em.*?alt="(.*?)".*?<p.*?">(.*?)<br>(.*?)</p.*?li>',re.S)
          items=re.findall(pattern,html)
          #print(items[0])
          
          for item in items:
              new=[x.strip() for x in item if x.strip()!='']
              print(new)

          執行結果:

          ['1', '肖申克的救贖', '導演: 弗蘭克·德拉邦特 Frank Darabont   主演: 蒂姆·羅賓斯 Tim Robbins /...', '1994 / 美國 / 犯罪 劇情']
          ['2', '霸王別姬', '導演: 陳凱歌 Kaige Chen   主演: 張國榮 Leslie Cheung / 張豐毅 Fengyi Zha...', '1993 / 中國大陸 中國香港 / 劇情 愛情 同性']
          ['3', '阿甘正傳', '導演: 羅伯特·澤米吉斯 Robert Zemeckis   主演: 湯姆·漢克斯 Tom Hanks / ...', '1994 / 美國 / 劇情 愛情']
          ['4', '泰坦尼克號', '導演: 詹姆斯·卡梅隆 James Cameron   主演: 萊昂納多·迪卡普里奧 Leonardo...', '1997 / 美國 墨西哥 澳大利亞 加拿大 / 劇情 愛情 災難']
          ['5', '這個殺手不太冷', '導演: 呂克·貝松 Luc Besson   主演: 讓·雷諾 Jean Reno / 娜塔莉·波特曼 ...', '1994 / 法國 美國 / 劇情 動作 犯罪']
          ['6', '美麗人生', '導演: 羅伯托·貝尼尼 Roberto Benigni   主演: 羅伯托·貝尼尼 Roberto Beni...', '1997 / 意大利 / 劇情 喜劇 愛情 戰爭']
          ['7', '千與千尋', '導演: 宮崎駿 Hayao Miyazaki   主演: 柊瑠美 Rumi H?ragi / 入野自由 Miy...', '2001 / 日本 / 劇情 動畫 奇幻']
          ['8', '辛德勒的名單', '導演: 史蒂文·斯皮爾伯格 Steven Spielberg   主演: 連姆·尼森 Liam Neeson...', '1993 / 美國 / 劇情 歷史 戰爭']
          ['9', '盜夢空間', '導演: 克里斯托弗·諾蘭 Christopher Nolan   主演: 萊昂納多·迪卡普里奧 Le...', '2010 / 美國 英國 / 劇情 科幻 懸疑 冒險']
          ['10', '星際穿越', '導演: 克里斯托弗·諾蘭 Christopher Nolan   主演: 馬修·麥康納 Matthew Mc...', '2014 / 美國 英國 加拿大 / 劇情 科幻 冒險']
          ['11', '忠犬八公的故事', '導演: 萊塞·霍爾斯道姆 Lasse Hallstr?m   主演: 理查·基爾 Richard Ger...', '2009 / 美國 英國 / 劇情']
          ['12', '楚門的世界', '導演: 彼得·威爾 Peter Weir   主演: 金·凱瑞 Jim Carrey / 勞拉·琳妮 Lau...', '1998 / 美國 / 劇情 科幻']
          ['13', '海上鋼琴師', '導演: 朱塞佩·托納多雷 Giuseppe Tornatore   主演: 蒂姆·羅斯 Tim Roth / ...', '1998 / 意大利 / 劇情 音樂']
          ['14', '三傻大鬧寶萊塢', '導演: 拉庫馬·希拉尼 Rajkumar Hirani   主演: 阿米爾·汗 Aamir Khan / 卡...', '2009 / 印度 / 劇情 喜劇 愛情 歌舞']
          ['15', '機器人總動員', '導演: 安德魯·斯坦頓 Andrew Stanton   主演: 本·貝爾特 Ben Burtt / 艾麗...', '2008 / 美國 / 科幻 動畫 冒險']
          ['16', '放牛班的春天', '導演: 克里斯托夫·巴拉蒂 Christophe Barratier   主演: 讓-巴蒂斯特·莫尼...', '2004 / 法國 瑞士 德國 / 劇情 喜劇 音樂']
          ['17', '無間道', '導演: 劉偉強 / 麥兆輝   主演: 劉德華 / 梁朝偉 / 黃秋生', '2002 / 中國香港 / 劇情 犯罪 驚悚']
          ['18', '瘋狂動物城', '導演: 拜倫·霍華德 Byron Howard / 瑞奇·摩爾 Rich Moore   主演: 金妮弗·...', '2016 / 美國 / 喜劇 動畫 冒險']
          ['19', '大話西游之大圣娶親', '導演: 劉鎮偉 Jeffrey Lau   主演: 周星馳 Stephen Chow / 吳孟達 Man Tat Ng...', '1995 / 中國香港 中國大陸 / 喜劇 愛情 奇幻 古裝']
          ['20', '熔爐', '導演: 黃東赫 Dong-hyuk Hwang   主演: 孔侑 Yoo Gong / 鄭有美 Yu-mi Jung /...', '2011 / 韓國 / 劇情']
          ['21', '控方證人', '導演: 比利·懷爾德 Billy Wilder   主演: 泰隆·鮑華 Tyrone Power / 瑪琳·...', '1957 / 美國 / 劇情 犯罪 懸疑']
          ['22', '教父', '導演: 弗朗西斯·福特·科波拉 Francis Ford Coppola   主演: 馬龍·白蘭度 M...', '1972 / 美國 / 劇情 犯罪']
          ['23', '當幸福來敲門', '導演: 加布里爾·穆奇諾 Gabriele Muccino   主演: 威爾·史密斯 Will Smith ...', '2006 / 美國 / 劇情 傳記 家庭']
          ['24', '觸不可及', '導演: 奧利維·那卡什 Olivier Nakache / 艾力克·托蘭達 Eric Toledano   主...', '2011 / 法國 / 劇情 喜劇']
          ['25', '怦然心動', '導演: 羅伯·萊納 Rob Reiner   主演: 瑪德琳·卡羅爾 Madeline Carroll / 卡...', '2010 / 美國 / 劇情 喜劇 愛情']

          到這里,單個頁面的信息就已經提取完成了,也算是完成了爬蟲的一小步了。

          則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

          1. 校驗基本日期格式

          var reg1=/^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/;
          var reg2=/^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$/;
          

          2. 校驗密碼強度

          密碼的強度必須是包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間。

          // 網友提供的解決檢測特殊字符的方法
          var reg=/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/;
          

          3. 校驗中文

          字符串僅能是中文。

          var reg=/^[\\u4e00-\\u9fa5]{0,}$/;
          

          4. 由數字、26個英文字母或下劃線組成的字符串

          var reg=/^\\w+$/;
          

          5. 校驗E-Mail 地址

          同密碼一樣,下面是E-mail地址合規性的正則檢查語句。

          var reg=/[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?/;
          

          6. 校驗身份證號碼

          下面是身份證號碼的正則校驗。15 或 18位。

          // 15位:
          var reg=/^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$/;
          // 18位:
          var reg=/^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$/;
          

          7. 校驗日期

          “yyyy-mm-dd” 格式的日期校驗,已考慮平閏年。

          var reg=/^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
          

          8. 校驗金額

          金額校驗,精確到2位小數。

          var reg=/^[0-9]+(.[0-9]{2})?$/;
          

          9. 校驗手機號

          下面是國內 13、15、18開頭的手機號正則表達式。(可根據目前國內收集號擴展前兩位開頭號碼)

          var reg=/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$/;
          

          10. 判斷IE的版本

          IE目前還沒被完全取代,很多頁面還是需要做版本兼容,下面是IE版本檢查的表達式。

          var reg=/^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\\/[5-9]\\.0).*$/;
          

          11. 校驗IP-v4地址

          var reg=/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b/;
          

          12. 校驗IP-v6地址

          var reg=/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/;
          

          13. 檢查URL的前綴

          應用開發中很多時候需要區分請求是HTTPS還是HTTP,通過下面的表達式可以取出一個url的前綴然后再邏輯判斷。

          if (!s.match(/^[a-zA-Z]+:\/\//)) {
              s='http://' + s;
          }
          

          14. 提取URL鏈接

          下面的這個表達式可以篩選出一段文本中的URL。

          var reg=/^(f|ht){1}(tp|tps):\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/;
          

          15. 文件路徑及擴展名校驗

          驗證windows下文件路徑和擴展名(下面的例子中為.txt文件)

          var reg=/^([a-zA-Z]\\:|\\\\)\\\\([^\\]+\\)*[^\\/:*?"<>|]+\\.txt(l)?$/;
          

          16. 提取Color Hex Codes

          有時需要抽取網頁中的顏色代碼,可以使用下面的表達式。

          var reg=/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
          

          17. 提取網頁圖片

          假若你想提取網頁中所有圖片信息,可以利用下面的表達式。

          var reg=/\\< *[img][^\\>]*[src] *=*[\\"\']{0,1}([^\\"\'\ >]*)/;
          

          18. 提取頁面超鏈接

          提取html中的超鏈接。

          var reg=/(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\/\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>/;
          

          19. 查找CSS屬性

          通過下面的表達式,可以搜索到相匹配的CSS屬性。

          var reg=/^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}/;
          

          20. 抽取注釋

          如果你需要移除HMTL中的注釋,可以使用如下的表達式。

          var reg=/<!--(.*?)-->/;
          

          21. 轉換千分位分隔符

          return total.toString().replace(/\B(?=(\d{3})+$)/g, ',');
          

          22. 統一社會信用代碼

          統一社會信用代碼由18位數字或者大寫字母組成,但是字母不包括 I、O、Z、S、V一共由五部分組成第一部分:登記管理部門代碼1位 (數字或大寫英文字母)第二部分:機構類別代碼1位 (數字或大寫英文字母)第三部分:登記管理機關行政區劃碼6位 (數字)第四部分:主體標識碼(組織機構代碼)9位 (數字或大寫英文字母)第五部分:校驗碼1位 (數字或大寫英文字母)正則如下:

          // 18位
          /[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}/
          // 15位(目前還有老的工商注冊代碼,也就是15位的社會信用代碼)
          /[1-9]\d{15}/
          // 同時支持18位和15位統一社會信用代碼
          /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/

          轉自:https://www.linuxprobe.com/regre-shili-xuexi.html

          表達式是Lisp編程語言家族的基礎。在本文中,我將逐步向您展示如何創建一個簡單的S表達式解析器。這可以作為Lisp解析器的基礎。

          Lisp是實現最簡單的語言之一,創建解析器是第一步。我們可以使用解析器生成器來完成這項任務,但自己編寫解析器會更容易。我們將使用JavaScript。

          (本文內容參考:java567.com)


          主站蜘蛛池模板: 国产成人一区二区精品非洲| 亚洲色无码一区二区三区| 一区五十路在线中出| 一区二区三区精品| 精彩视频一区二区| 国产精品久久亚洲一区二区| 久久99精品波多结衣一区| 国产AV一区二区三区传媒| 国产精品视频一区二区三区经| 亚洲日本va一区二区三区| 免费视频精品一区二区| 蜜臀AV免费一区二区三区| 国产一区二区三区露脸| 高清一区二区三区免费视频 | 理论亚洲区美一区二区三区 | 国产福利电影一区二区三区久久久久成人精品综合 | 久久无码人妻一区二区三区 | 无码人妻精品一区二区三区在线 | 国产一区二区视频免费| 亚洲福利视频一区| 国产精品被窝福利一区| ...91久久精品一区二区三区| 日韩福利视频一区| 99在线精品一区二区三区| 成人区精品人妻一区二区不卡| 亚洲AV无码一区二区三区牲色 | 久久精品免费一区二区三区 | 国产一区二区三区夜色| 波多野结衣AV一区二区三区中文| 日韩欧国产精品一区综合无码| 国产伦精品一区二区| 亚洲一区二区三区亚瑟| 国产成人精品无码一区二区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 蜜桃视频一区二区| 国产人妖视频一区在线观看| 日韩精品一区二区三区中文3d| 无码夜色一区二区三区| 深田咏美AV一区二区三区| 日韩精品一区二区三区老鸭窝| 99精品国产高清一区二区|