正則表達式

正則表達式中的特殊字符

  1. ^的用法

^一般用在字符串匹配模式的開頭,^表示以某一個字符開頭,如:^a表示匹配的字符串必須以a開頭。正則表達式

  1. .*的用法

.表示匹配任意一個字符,*表示出現0次或屢次,例如:^a.*表示,匹配的字符串須要以a開頭,而且後面能夠是0個或者多個任意字符。code

  1. $字符的用法

$字符通常用在匹配模式的結尾,表明匹配的字符串須要之前面的那個字符結尾。例如:^a.*6$表示,匹配的字符串須要以a開頭,後面是0個或者多個任意字符,而且要以6結尾。utf-8

  1. ?的常見用法

正則表達式一般是一種貪婪的匹配方式,而?表明了一種非貪婪的匹配模式。能夠表示重複前面的內容0次或1次,也就是要麼不出現要麼出現一次。例如:line = "sucansssoooo1226",如今,須要找出從第一個s到第二個s之間的內容。字符串

line = "sucansssoooo1226"
reg_str = ".*(s.*s).*"
match_obj = re.match(reg_str,line)
if match_obj:
    print(match_obj.group(1))

在上面的代碼中,咱們獲得的結果是:ss。這正是由於正則表達式貪婪匹配的結果。正則表達式會一直匹配到最後符合要求的結果。下面咱們修改匹配模式import

reg_str = ".*?(s.*s).*"

修改以後,咱們獲得的結果是:sucansss。在第一個量詞*後面加上?表示,找到第一個s的時候,就記下來,可是後面,仍是一種貪婪匹配的模式,會一直日後找到s。繼續修改匹配模式coding

reg_str = ".*?(s.*?s).*"

這時候的輸出結果是:sucans。表示已經獲得了想要的結果。第二個問號表示,在找到第二個s的時候,就中止匹配,這就是一種非貪婪的匹配模式。sso

  1. +的使用方法。

+表示,+前面的字符必須至少出現一次。同時也是一種貪婪的匹配模式。與*不一樣的是,*表示前面的字符能夠出現0次或屢次,而+表示至少出現一次。一樣的,仍是上面的字符串,咱們將正則表達式,修改爲下面這樣:方法

".*(s.+s).*"

輸出結果會變成:sss。爲何不是ss呢?就是由於,在正則表達式中,咱們用了.+這樣就表示,ss之間至少必須有一個字符才符合要求。im

  1. {}的使用方法

{}有三種常見的用法:一、{2},花括號,裏面有一個數字,表示,花括號前面的字符出現的次數只能是花括號裏面的數字;二、{2,},花括號,數字,逗號。表示,前面的字符出現的次數至少是花括號裏面的數字;三、{2,5},花括號,數字區間。表示,前面的字符出現的次數,只能在這個區間內。如例:最少2次,最多5次。di

  1. |的使用

|表示或者,好比:sucan | sucan1226。表示匹配sucan或者sucan1226,只要字符串中包含二者中的任意一個都知足條件。

  1. []的使用

[]表示,只要字符是[]裏面的任意一個都知足條件:例如:常見的手機號碼的匹配1[3578][0-9]{9}。表示,以1開頭,後面必須是3578中的一個,後面必須是0-9之間的數字,同時,只能出現9次。注意:中括號中的特殊字符沒有特殊含義。例如:[. ]表示,只有字符知足是.的時候才知足要求。再好比:[^1]表示,只要字符不是1都知足要求。

  1. \s

匹配空格,例如:line = 你 好。匹配這個字符串就須要reg= 你\s好。

  1. \S

匹配任意非空格。與\s恰好相反。一樣若是:line = 你 好。這時候用 reg = 你\S好,就匹配不了。

  1. \w

\w的功能就是[A-Za-z0-9_],意思就是匹配任意一個字符,若是字符知足:A-Z或這個a-z或者0-9或者是_的時候。

  1. \W

\W的功能跟\s恰好相反,只要不知足\w的任意字符,都知足\W。例如:空格,等。

  1. [\u4E00-\u9FA5]

匹配漢字。

  1. \d

匹配數字。例如:XXXX出生於1992年。如今,咱們須要提取出1992。

line = "XXXX出生於1992年"
reg_str = ".*(\d{4}).*"
match_obj = re.match(reg_str,line)
if match_obj:
    print(match_obj.group(1))

上面是第一種方法,爲何不直接用(\d+)呢?這樣是匹配不到的,這樣只會匹配出來2。由於貪婪匹配!!!。除了上面這種方法,咱們還能夠將正則表達式修改一下。加上?取消貪婪匹配。

reg_str = ".*?(\d+).*"

Demo:用正則表達式匹配多種出生日期的書寫

# -*- coding:utf-8 -*-
__author__ = "sucan"

import re

line = "XXXX出生於1992年1月"
line = "XXXX出生於1992年1月1日"
line = "XXXX出生於1992/1/1"
line = "XXXX出生於1992-01-01"
line = "XXXX出生於1992-1"
line = "XXXX出生於1992-01"
reg_str = ".*出生於(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"
match_obj = re.match(reg_str,line)
if match_obj:
    print(match_obj.group(1))
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息