python的正则

正则最重要: 

1:元字符:

   元字符在匹配自身时,是不会与自身字符意思相等,例如. 不等于字符.  需要加\.转义才能表示是字符串

. ^ $ * + ? { [ ] \ | ( )

  [ ]通常用来表示区间,[abc] 将匹配"a", "b", 或 "c"中的任意一个字符;也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,那么 RE 应写成 [a-z].

  用 "\" 开始的特殊字符所表示的预定义字符集通常是很有用的,象数字集,字母集,或其它非空字符集。下列是可用的预设特殊字符:

  

\d  匹配任何十进制数;它相当于类 [0-9]。   记忆:digital == d
\D  匹配任何非数字字符;它相当于类 [^0-9]。
\s  匹配任何空白字符;它相当于类  [ \t\n\r\f\v]。记忆:space == s
\S  匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w  匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。 记忆:word == w
\W  匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。 

  *表示0或者多次

  +表示1或者多次

  ?表示0或者1次

  {m,n}:至少有 m 个重复,至多到 n 个重复

  可以忽略 m 或 n;因为会为缺失的值假设一个合理的值。忽略 m 会认为下边界是 0,而忽略 n 的结果将是上边界为无穷大

  \反斜杠的问题。如果匹配字符是"\dog",就上面\d代表数字,这里就开始有歧义了,所以\需要用反斜杠来转义自己

 这里表达式就写为"\\dog"了,还可以使用r令字符串内一个或者多个反斜杠不转义 所以表达式可以这样r"\dog"

2:匹配方法

  

方法 作用
match()

re.match(pattern, string[, flags]) 

从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾

search()

re.search(pattern, string[, flags])  

若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。

flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回
finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

  1:使用正则,先生产一个re的表达式

>>> import re
>>> p = re.compile('[a-z]+')

matchobject

import re
#re.compile("表达式"),返回一个正则表达式的对象
p = re.compile("[abc]+")
print(p)
#返回一个matchobject的实例
m=p.match("abbbbcsdd")
print(m.group())
print(m.start())
print(m.end())
print(m.span())
#结果

re.compile('[abc]+')
abbbbc
0
6
(0, 6)

  match对象的方法:

方法/属性作用
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置

 match对象在实际程序中,最常见的作法是将 MatchObject 保存在一个变量里,然後检查它是否为 None

import re
#re.compile("表达式"),返回一个正则表达式的对象
p = re.compile("[abc]+")
print(p)
#返回一个matchobject的实例
m=p.match("abbbbcsdd")
if m:
    print("匹配到")
else:
    print("没有匹配到")

 边界匹配:

^ 匹配字符串的开头

$ 匹配字符串的结尾

 

分组匹配:

(表达式1),(表达式2)  对应match对象的group(1),group(2)

import re
#!/usr/bin/python
import re
s = "asa are 1223 adfasdf"
matchObj = re.match( '(\w+) are (\d+) .*', s, re.M|re.I)
if matchObj:
    print("matchObj.group() : ", matchObj.group())#sa are 1223 adfasdf
    print("matchObj.group(1) : ", matchObj.group(1))#asa
    print("matchObj.group(2) : ", matchObj.group(2))#1223
else:
    print("No match!!")

  | 或者匹配,先匹配左边,一旦成功匹配,则跳过右边的表达式,如果|没有被包括到()中,他的范围是整个表达式

b = '22asdfjk22'
b = re.match('[a-z]+|\d+',b)
print(b.group())#22

  

 

posted @ 2017-11-23 11:55  zimsan  阅读(174)  评论(0)    收藏  举报