1. 程式人生 > 其它 >正則表示式和re模組

正則表示式和re模組

# 什麼是正則表示式
    # 一套規範 - 匹配字串的規則

# 正則表示式能做什麼?
    # 1.檢測一個輸入的字串是否合法 -- web開發專案 表單驗證
      # 使用者輸入一個內容的時候,我們要提前做檢測
      # 這樣能夠提高程式的效率並且減輕伺服器的壓力
    
    # 2.從一個大檔案中找到所有符合規則的內容 -- 日誌分析/爬蟲
      # 能夠高效的從大段文字中快速找到符合規則的內容

# 正則規則
# 所有的規則中的字元就可以剛好匹配到字串中的內容
# 字元組 [] 描述的是一個位置上能出現的所有可能性
  # 接受範圍,可以描述多個範圍,連著寫就可以了
  # [abc] 匹配a或b或c中的任意一個字元一次,一個字元組只表示一個位置
  # [0-9]  根據Ascii進行範圍的對比
  # [A-Z]
  # [a-z]
  # [a-zA-Z] 把範圍大的寫在前面,表示匹配大小寫字母
  # [0-9a-zA-Z] 表示匹配數字或大小寫字母
# 在正則表示式中你能夠幫助我們表示匹配的內容的符號都是正則中的 元字元
# [0-9]  --> \d 表示匹配一位數字 digit
# [0-9a-zA-Z——]  --> \w 表示匹配數字|字母|下劃線
# 空格 -->
# tab --> \t
# enter --> \n
# 空格,tab,回車 --> \s 表示匹配所有空白 包括空格,tab 和回車

# 元字元
# []
# \d
# \w
# \s
# \t
# \n
# \D  # 非數字
# \W  # 非數字字母下劃線
# \S  # 非空白字元
# [\d\D] [\w\W] [\s\S] 代表匹配任意字元
# .    匹配除換行符之外的所有
# [^\d]  匹配所有的非數字 非字元組
# ^     匹配一個字元的開始
# $     匹配一個字元的結尾
# a表示式|b表示式    匹配a或b表示式 如果匹配a成功了不會匹配b
                    # 所有兩個規則有重疊部分總是把長的房子前面
# ()    # 約束 | 描述的內容範圍的問題





# 記憶元字元:表示能匹配到哪些內容,一個元字元總是表示一個位置上的內容
# \d \w \s \t \n \D \W \S 
# [] [^]
# ^ $
# | ()

# 量詞
# {n}  表示匹配n次
# {n,}  表示匹配至少n次
# {n,m}  表示匹配n到m次
# ? --> {0,1} 表示匹配0到1次
# + --> {1,}  表示匹配至少1次
# * --> {0,}  表示匹配任意次


# 整數[1-9]\d*
# 小數\d+\.\d+
# 整數\d+(\.\d)?\d*

# 分組的作用

# 手機號碼
  # 1 3-9 11位
  # 1[3-9]\d{9}

# 判斷使用者輸入的內容是否合法,如果使用者輸入對就能查到結果,iguana輸入的不對就不能查到結果
# ^1[3-9]\d{9}$

# 從一個大檔案中查詢到所以符合規則的內容
# 1[3-9]\d{9}
# 回溯
# 1\d+6 
# 這是一個貪婪匹配,先找到1開頭的在如果後面是數字就一直匹配直到匹配到一個非數字才停止
# 然後在往回找6這就叫回溯

# 貪婪匹配 
  # 在量詞範圍允許的情況下多匹配
  # 1\d?3
  # 1\d{1,3}3

# 非貪婪(惰性)匹配
  # .*?x 表示匹配任意字元任意次數,但是遇到x就停下來
  # .*x  表示匹配任意字元任意次數,直到匹配到最後一個x才停下來 (貪婪)
  # 1\d??3
  # 1\d{1,3}?3
# 在量詞後面加一個?代表非貪婪(惰性)匹配
# 元字元 量詞 ?
# \d{3,}?6

# 轉義符
  # 原本有特殊意義的字元,到了表達他本身的時候,需要轉義
  # 有一些特殊意義的字元,放到字元組中會取消特殊意義
  # [.]
  # [().*?] 所有的內容在字元組中會取消它的特殊意義、
  # [a\-c]   - 在字元組中表示範圍,如果不希望它表示範圍,需要轉義,或者放在字元組的最前面或最後面


# 18/15 位的身份證
# 15
    # 1-9 14
    # [1-9]\d{14}
# 18
    # 1-9 16 0-9/x
    # [1-9]\d[16][0-9x]


#^([1-9]\d{16}[0-9x] | [1-9]\d{14})$




import re
ret = re.findall('\d+','123sald123')
print('ret')
if ret:
  print(ret.group())
ret_s = re.seach('123','anc123asd123l123')