正則表達式

語法:python

import re #導入模塊名
 
p = re.compile("^[0-9]")  #生成要匹配的正則對象 , ^表明從開頭匹配,[0-9]表明匹配0至9的任意一個數字, 因此這裏的意思是對來的字符串進行匹配,若是這個字符串的開頭第一個字符是數字,就表明匹配上了
 
m = p.match('14534Abc')   #按上面生成的正則對象 去匹配 字符串, 若是能匹配成功,這個m就會有值, 不然m爲None<br><br>if m: #不爲空表明匹配上了
print(m.group())    #m.group()返回匹配上的結果,此處爲1,由於匹配上的是1這個字符<br>else:<br>  print("doesn't match.")<br>

***結果是none的時候不能用group(),報錯。。。。正則表達式

上面的第2 和第3行也能夠合併成一行來寫:express

m = p.match("^[0-9]",'14534Abc')

效果是同樣的,區別在於,第一種方式是提早對要匹配的格式進行了編譯(對匹配公式進行解析),這樣再去匹配的時候就不用在編譯匹配的格式,第2種簡寫是每次匹配的時候 都 要進行一次匹配公式的編譯,因此,若是你須要從一個5w行的文件中匹配出全部以數字開頭的行,建議先把正則公式進行編譯再匹配,這樣速度會快點。編程

圖解:ruby

ip_adds = '192.168.1.2213'     #字符
m = re.match('([0-9]{1,3}\.){3}\d{1,3}',ip_adds)
print(m.group())

 

匹配格式:編程語言

元字符
描述
\
將下一個字符標記符、或一個向後引用、或一個八進制轉義符。例如,「\\n」匹配\n。「\n」匹配換行符。序列「\\」匹配「\」而「\(」則匹配「(」。即至關於多種編程語言中都有的「轉義字符」的概念。
^
匹配輸入字符串的開始位置。若是設置了RegExp對象的Multiline屬性,^也匹配「\n」或「\r」以後的位置。
$
匹配輸入字符串的結束位置。若是設置了RegExp對象的Multiline屬性,$也匹配「\n」或「\r」以前的位置。
*
匹配前面的子表達式任意次。例如,zo*能匹配「z」,「zo」以及「zoo」,可是不匹配「bo」。*等價於{0,}。
+
匹配前面的子表達式一次或屢次(大於等於1次)。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價於{1,}。
?
匹配前面的子表達式零次或一次。例如,「do(es)?」能夠匹配「do」或「does」中的「do」。?等價於{0,1}。
{n}
n是一個非負整數。匹配肯定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,可是能匹配「food」中的兩個o。
{n,}
n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的全部o。「o{1,}」等價於「o+」。「o{0,}」則等價於「o*」。
{n,m}
m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」將匹配「fooooood」中的前三個o。「o{0,1}」等價於「o?」。請注意在逗號和兩個數之間不能有空格。
?
當該字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少的匹配所搜索的字符串,而默認的貪婪模式則儘量多的匹配所搜索的字符串。例如,對於字符串「oooo」,「o+?」將匹配單個「o」,而「o+」將匹配全部「o」。
.點
匹配除「\r\n」以外的任何單個字符。要匹配包括「\r\n」在內的任何字符,請使用像「[\s\S]」的模式。
(pattern)
匹配pattern並獲取這一匹配。所獲取的匹配能夠從產生的Matches集合獲得,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用「\(」或「\)」。
(?:pattern)
非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供之後使用。這在使用或字符「(|)」來組合一個模式的各個部分是頗有用。例如「industr(?:y|ies)」就是一個比「industry|industries」更簡略的表達式。
(?=pattern)
非獲取匹配,正向確定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不須要獲取供之後使用。例如,「Windows(?=95|98|NT|2000)」能匹配「Windows2000」中的「Windows」,但不能匹配「Windows3.1」中的「Windows」。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。
(?!pattern)
非獲取匹配,正向否認預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不須要獲取供之後使用。例如「Windows(?!95|98|NT|2000)」能匹配「Windows3.1」中的「Windows」,但不能匹配「Windows2000」中的「Windows」。
(?<=pattern)
非獲取匹配,反向確定預查,與正向確定預查相似,只是方向相反。例如,「(?<=95|98|NT|2000)Windows」能匹配「2000Windows」中的「Windows」,但不能匹配「3.1Windows」中的「Windows」。
(?<!pattern)
非獲取匹配,反向否認預查,與正向否認預查相似,只是方向相反。例如「(?<!95|98|NT|2000)Windows」能匹配「3.1Windows」中的「Windows」,但不能匹配「2000Windows」中的「Windows」。
x|y
匹配x或y。例如,「z|food」能匹配「z」或「food」或"zood"(此處請謹慎)。「(z|f)ood」則匹配「zood」或「food」。
[xyz]
字符集合。匹配所包含的任意一個字符。例如,「[abc]」能夠匹配「plain」中的「a」。
[^xyz]
負值字符集合。匹配未包含的任意字符。例如,「[^abc]」能夠匹配「plain」中的「plin」。
[a-z]
字符範圍。匹配指定範圍內的任意字符。例如,「[a-z]」能夠匹配「a」到「z」範圍內的任意小寫字母字符。
注意:只有連字符在字符組內部時,而且出如今兩個字符之間時,才能表示字符的範圍; 若是出字符組的開頭,則只能表示連字符自己.
[^a-z]
負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,「[^a-z]」能夠匹配任何不在「a」到「z」範圍內的任意字符。
\b
匹配一個單詞邊界,也就是指單詞和空格間的位置(即正則表達式的「匹配」有兩種概念,一種是匹配字符,一種是匹配位置,這裏的\b就是匹配位置的)。例如,「er\b」能夠匹配「never」中的「er」,但不能匹配「verb」中的「er」。
\B
匹配非單詞邊界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。
\cx
匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。不然,將c視爲一個原義的「c」字符。
\d
匹配一個數字字符。等價於[0-9]。
\D
匹配一個非數字字符。等價於[^0-9]。
\f
匹配一個換頁符。等價於\x0c和\cL。
\n
匹配一個換行符。等價於\x0a和\cJ。
\r
匹配一個回車符。等價於\x0d和\cM。
\s
匹配任何不可見字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。
\S
匹配任何可見字符。等價於[^ \f\n\r\t\v]。
\t
匹配一個製表符。等價於\x09和\cI。
\v
匹配一個垂直製表符。等價於\x0b和\cK。
\w
匹配包括下劃線的任何單詞字符。相似但不等價於「[A-Za-z0-9_]」,這裏的"單詞"字符使用Unicode字符集。
\W
匹配任何非單詞字符。等價於「[^A-Za-z0-9_]」。
\xn
匹配n,其中n爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。例如,「\x41」匹配「A」。「\x041」則等價於「\x04&1」。正則表達式中可使用ASCII編碼。
\num
匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,「(.)\1」匹配兩個連續的相同字符。
\n
標識一個八進制轉義值或一個向後引用。若是\n以前至少n個獲取的子表達式,則n爲向後引用。不然,若是n爲八進制數字(0-7),則n爲一個八進制轉義值。
\nm
標識一個八進制轉義值或一個向後引用。若是\nm以前至少有nm個得到子表達式,則nm爲向後引用。若是\nm以前至少有n個獲取,則n爲一個後跟文字m的向後引用。若是前面的條件都不知足,若n和m均爲八進制數字(0-7),則\nm將匹配八進制轉義值nm。
\nml
若是n爲八進制數字(0-7),且m和l均爲八進制數字(0-7),則匹配八進制轉義值nml。
\un
匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(&copy;)。
< > 匹配詞(word)的開始(<)和結束(>)。例如正則表達式<the>可以匹配字符串"for the wise"中的"the",可是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是全部的軟件都支持的。
( ) 將( 和 ) 之間的表達式定義爲「組」(group),而且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多能夠保存9個),它們能夠用 \1 到\9 的符號來引用。
| 將兩個匹配條件進行邏輯「或」(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",可是不能匹配"it belongs to them."。注意:這個元字符不是全部的軟件都支持的。
+ 匹配1或多個正好在它以前的那個字符。例如正則表達式9+匹配九、9九、999等。注意:這個元字符不是全部的軟件都支持的。
? 匹配0或1個正好在它以前的那個字符。注意:這個元字符不是全部的軟件都支持的。
{i} {i,j} 匹配指定數目的字符,這些字符是在它以前的表達式定義的。例如正則表達式A[0-9]{3} 可以匹配字符"A"後面跟着正好3個數字字符的串,例如A12三、A348等,可是不匹配A1234。而正則表達式[0-9]{4,6} 匹配連續的任意4個、5個或者6個數字

  

正則表達式經常使用5種操做ide

re.match(pattern, string)     # 從頭匹配函數

re.search(pattern, string)    # 匹配整個字符串,直到找到一個匹配編碼

re.split()            # 將匹配到的格式當作分割點對字符串分割成列表spa

m = re.split("[0-9]", "alex1rain2jack3helen rachel8")
print(m)

輸出: ['alex', 'rain', 'jack', 'helen rachel', '']

re.findall()          # 找到全部要匹配的字符並返回列表格式

m = re.findall("[0-9]", "alex1rain2jack3helen rachel8")
print(m)<br>

輸出:['1', '2', '3', '8']

re.sub(pattern, repl, string, count,flag)    # 替換匹配到的字符

m=re.sub("[0-9]","|", "alex1rain2jack3helen rachel8",count=2 )
print(m)

輸出:alex|rain|jack3helen rachel8

 

 

正則表達式實例

字符匹配

實例 描述
python 匹配 "python".

字符類

實例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括號內的任意一個字母
[0-9] 匹配任何數字。相似於 [0123456789]
[a-z] 匹配任何小寫字母
[A-Z] 匹配任何大寫字母
[a-zA-Z0-9] 匹配任何字母及數字
[^aeiou] 除了aeiou字母之外的全部字符
[^0-9] 匹配除了數字外的字符

特殊字符類

實例 描述
. 匹配除 "\n" 以外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。
\d 匹配一個數字字符。等價於 [0-9]。
\D 匹配一個非數字字符。等價於 [^0-9]。
\s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。
\w 匹配包括下劃線的任何單詞字符。等價於'[A-Za-z0-9_]'。
\W 匹配任何非單詞字符。等價於 '[^A-Za-z0-9_]'。

 

 

re.match與re.search的區別

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

Regular Expression Modifiers: Option Flags

Regular expression literals may include an optional modifier to control various aspects of matching. The modifiers are specified as an optional flag. You can provide multiple modifiers using exclusive OR (|), as shown previously and may be represented by one of these −

Modifier Description
re.I

Performs case-insensitive matching.          #對大小寫不敏感

例子:

>>>string = "KOBE"

>>>m=re.match('[a-z]',string,flags=re.I)  #關鍵詞flags,不能用其它變量名

>>>print(m.group())

re.L Interprets words according to the current locale. This interpretation affects the alphabetic group (\w and \W), as well as word boundary behavior (\b and \B).
re.M Makes $ match the end of a line (not just the end of the string) and makes ^ match the start of any line (not just the start of the string).
re.S Makes a period (dot) match any character, including a newline.
re.U Interprets letters according to the Unicode character set. This flag affects the behavior of \w, \W, \b, \B.
re.X Permits "cuter" regular expression syntax. It ignores whitespace (except inside a set [] or when escaped by a backslash) and treats unescaped # as a comment marker.

 

幾個常見正則例子:

匹配手機號:

phone_str = "hey my name is alex, and my phone number is 13651054607, please call me if you are pretty!"
phone_str2 = "hey my name is alex, and my phone number is 18651054604, please call me if you are pretty!"
 
m = re.search("(1)([358]\d{9})",phone_str2)
if m:
    print(m.group())

匹配IP V4:

ip_addr = "inet 192.168.60.223 netmask 0xffffff00 broadcast 192.168.60.255"
 
m = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", ip_addr)
 
print(m.group())

分組匹配地址

contactInfo = 'Oldboy School, Beijing Changping Shahe: 010-8343245'
match = re.search(r'(\w+), (\w+): (\S+)', contactInfo) #分組
"""
>>> match.group(1)
  'Doe'
  >>> match.group(2)
  'John'
  >>> match.group(3)
  '555-1212'
"""
match = re.search(r'(?P<last>\w+), (?P<first>\w+): (?P<phone>\S+)', contactInfo)
"""
 >>> match.group('last')
  'Doe'
  >>> match.group('first')
  'John'
  >>> match.group('phone')
  '555-1212'
"""

匹配email:

email = "alex.li@126.com   http://www.oldboyedu.com"
 
m = re.search(r"[0-9.a-z]{0,26}@[0-9.a-z]{0,20}.[0-9a-z]{0,8}", email)
print(m.group())
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息