投稿005期|5分鐘學會正則,解決98%爬蟲需要做字串提取的工作

else發表於2021-09-09

介紹幾種非常常用的特殊字元,解決98%爬蟲需要做字串提取的工作。

正規表示式最常見的字元
  • 1)特殊字元:就是一些有特殊含義的字元。 $ () * + . [ ? ^ { |

  • 2)限定符:用來指定正規表示式的一個給定元件必須要出現多少次才能滿足匹配。* + ? {n} {n,} {n,m}

  • 3)定位符:用來描述字串或單詞的邊界。^ $

  • 4)其他字元:w W s S d

> 直接進入python示例

1、介紹^ . * $的用法
  • 1)^ 匹配輸入字串開始的位置。
  • 2)字元. 匹配除換行符 n 之外的任何單字元。
  • 3)字元* 匹配前面的子表示式零次或多次。
  • 4)字元 $ 匹配輸入字串的結尾位置。
# -*- coding:utf-8 -*-

'''
by yizhiamumu
20171101
'''

import  re

'''1介紹^ . * $的用法
^ 匹配輸入字串開始的位置。
. 匹配除換行符 n 之外的任何單字元。
* 匹配前面的子表示式零次或多次。
$ 匹配輸入字串的結尾位置。
'''

#需要匹配的字串
line = "hello world"

#1.列印 以h 開頭的文字

regex_str = '^h'
if re.match(regex_str, line):
    print "1, 列印以h 開頭的文字"

#2.列印 以h 開頭,後面跟著一個字串
regex_str = '^h.'
if re.match(regex_str, line):
    print  "2, 列印以h 開頭,後面跟著一個字串"

#3.列印以h 開頭,跟任意數量字串
regex_str = '^h*'
if re.match(regex_str, line):
    print  "3列印以h 開頭,後面任意數量的字串"

#4以d 結尾
regex_str = '.*d$'
if re.match(regex_str, line):
    print "4 匹配以d 結尾的字串"

#5 以h 開頭,以d 結尾,中間只有任意一個字串
regex_str = '^h.d$'
if re.match(regex_str, line):
    print  "5 以h 開頭, 以d 結尾,中間只有任意一個字串"

#6 以h 開頭, 以d 結尾,中間任意字串
regex_str = '^h.*d$'
if re.match(regex_str, line):
    print "6 h開頭,以d 結尾,中間任意一個字串"

列印日誌:

圖片描述

2、介紹() ?用法
  • ()標記一個子表示式的開始和結束位置。
  • ?匹配前面的子表示式零次或一次,或指明一個非貪婪限定符。

'''2介紹() ?用法
()標記一個子表示式的開始和結束位置。
?匹配前面的子表示式零次或一次,或指明一個非貪婪限定符。
'''

line = "hellohailhelloworld"

#獲取hail

regex_str = '.*(h.*h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "獲取hail,列印結果為hailh"
    print match_obj.group(1)

#使用非貪婪限定符,強制從左開始匹配
regex_str = '.*?(h.*h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用非貪婪限定符,強制從左開始匹配"
    print match_obj.group(1)

#使用非貪婪限定符,強制從左開始匹配,遇到第一個h 就停止匹配
regex_str = '.*?(h.*?h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用非貪婪限定符,強制從左開始匹配,遇到第一個h 就停止匹配"
    print  match_obj.group(1)

列印日誌:

圖片描述

3、介紹+ {n} {n,} {n,m}用法
  • 1)+匹配前面的子表示式一次或多次。

例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。

  • 2){n} n 是一個非負整數。匹配確定的 n 次。

例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。

  • 3){n,} n 是一個非負整數。至少匹配n 次。

例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。

  • 4){n,m} m 和 n 均為非負整數,其中n

例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。


'''
3、介紹+ {n} {n,} {n,m}用法
1)+匹配前面的子表示式一次或多次。
例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
2){n} n 是一個非負整數。匹配確定的 n 次。
例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
3){n,} n 是一個非負整數。至少匹配n 次。
例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
4){n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。
例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

'''

line = "hellohailhihello world"

#獲取h 和 h 之間包含特定數量字元的子字串
#使用+, h和h 之間至少要有一個字元

regex_str = '.*(h.+h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用+,獲取h 和 h 之間包含特定數量字元的子字串,h 和 h 之間至少有一個字元"
    print match_obj.group(1)

#使用{1}, h和h 之間至少有一個字元

regex_str = '.*(h.{1}h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用{1}, h和h 之間至少有一個字元"
    print  match_obj.group(1)

#使用{2,} ,h 和 h 之間至少有兩個字元
regex_str = '.*(h.{2,}h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用{2,} ,h 和 h 之間至少有兩個字元"
    print  match_obj.group(1)

# 使用{3,5} , h 和 h  之間的字元限定在3-5個
regex_str = '.*(h.{3,5}h).*'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用{3,5} , h 和 h  之間的字元限定在3-5個"
    print  match_obj.group(1)

列印日誌:

圖片描述

4、介紹|[123] [0-9] [^1]用法
  • 1)|指明兩項之間的一個選擇。
  • 2)[123] 只要是123中的其中一個即可。
  • 3)[0-9] 只要是0-9中的任意數字即可。
  • 4)[^1] 非,只要不是1即可。
'''
4、介紹|[123] [0-9] [^1]用法

1)|指明兩項之間的一個選擇。
2)[123] 只要是123中的其中一個即可。
3)[0-9] 只要是0-9中的任意數字即可。
4)[^1] 非,只要不是1即可。

'''
line = "hello world"
#   匹配hello world
regex_str = '(hello world|hi world)'
match_obj = re.match(regex_str, line)
if match_obj:
    print "123"
    print match_obj.group(1)
# 使用[] 匹配手機號, 1之後只要是3578 中的一個即可,後面0-9 中的數字出現9次
line = '18662342234'
regex_str = '1[3578][0-9]{9}'
match_obj = re.match(regex_str, line)
if match_obj:
    print "正確的手機號"

# 使用[]匹配手機號, 1之後只要是3578 中的一個即可,後面數字不能為1
regex_str = '1[3578][^1]{9}'
match_obj = re.match(regex_str, line)
if match_obj:
    print "使用[]匹配手機號, 1之後只要是3578 中的一個即可,後面數字不能為1"

列印日誌:

圖片描述

5、介紹s S w W d用法
  • 1)s匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ fnrtv]。
  • 2)S匹配任何非空白字元。等價於 [^ fnrtv]。
  • 3)w 等價於[A-Za-z0-9_]。
  • 4)W 與w相反。
  • 5)d 所有數字,等價於[0-9]。

'''
5、介紹s S w W d用法

1)s匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ fnrtv]。
2)S匹配任何非空白字元。等價於 [^ fnrtv]。
3)w 等價於[A-Za-z0-9_]。
4)W 與w相反。
5)d 所有數字,等價於[0-9]。

'''
line = 'hello world'
regex_str = '(hellosworld)'
match_obj = re.match(regex_str, line)
if match_obj:
    print "hello world 之間有空格"

regex_str2 = '(helloSworld)'
match_obj = re.match(regex_str2, line)
if match_obj:
    print "不是空格"

regex_str3 = '(hellowworld)'
match_obj = re.match(regex_str3, line)
if match_obj:
    print "hello world 之間有[A-Za-z0-9_]其中的字元"

regex_str4 = '(helloWworld)'
match_obj = re.match(regex_str4, line)
if match_obj:
    print "hello world 之間不是[A-Za-z0-9_]其中的字元"

line = 'hello world 007'
regex_str5 = '.*?(d+)'
match_obj = re.match(regex_str5, line)
if match_obj:
    print "列印其中數字"
    print match_obj.group(1)

列印日誌:

圖片描述

over

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2318/viewspace-2804008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章