python正则匹配说明

Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里存在陷阱。raw string就是用'r'作为字符串的前缀,如 r"\n":表示两个字符"\"和"n",而不是换行符了。Python中写正则表达式时推荐使用这种形式。


正则表达式中特殊的符号:


"." 表任意字符

"^ " 表string起始

"$" 表string 结束

“*” “+” “?” 跟在字符后面表示,0个——多个, 1个——多个, 0个或者1个

*?, +?, ?? 符合条件的情况下,匹配的尽可能少//限制*,+,?匹配的贪婪性

{m} 匹配此前的字符,重复m次

{m,n} m到n次,m,n可以省略


举个例子 ‘a.*b’ 表示a开始,b结束的任意字符串

a{5} 匹配连续5个a


[] 表一系列字符 [abcd] 表a,b,c,d [^a] 表示非a

| A|B 表示A或者B , AB为任意的正则表达式 另外|是非贪婪的如果A匹配,则不找B

(…) 这个括号的作用要结合实例才能理解, 用于提取信息


\d [0-9]

\D 非 \d

\s 表示空字符

\S 非空字符

\w [a-zA-Z0-9_]

\W 非 \w


函数

re.findall

re.findall可以获取字符串中所有匹配的字符串。如:re.findall(r'\w*oo\w*', text);获取字符串中,包含'oo'的所有单词。

{m},用来表示前面正则表达式的m次copy,如"a{5}",表示匹配5个”a”,即"aaaaa"
>>> re.findall("a{5}","aaaaaaaaaa")
['aaaaa', 'aaaaa']
>>> re.findall("a{5}","aaaaaaaaa")
['aaaaa']
{m.n}用来表示前面正则表达式的m到n次copy,尝试匹配尽可能多的copy。
>>> re.findall("a{2,4}","aaaaaaaa")
['aaaa', 'aaaa']
通过上面的例子,可以看到{m,n},正则表达式优先匹配n,而不是m,因为结果不是["aa","aa","aa","aa"]
>>> re.findall("a{2}","aaaaaaaa")
['aa', 'aa', 'aa', 'aa']
{m,n}?  用来表示前面正则表达式的m到n次copy,尝试匹配尽可能少的copy   
>>> re.findall("a{2,4}?","aaaaaaaa")
['aa', 'aa', 'aa', 'aa']
#!/usr/bin/python
import re
a=open('ip.txt','r')
b=a.readlines()
for c in b:
        d=re.findall(r'.{2}',c)  #这个语句用到了python的(raw string),表示后边的字符无需转义,'.{2}'任意字符匹配两次
        e='_'.join(d)
        print e
a.close

ip.txt内容

[root@dating01 python]# cat ip.txt
50E549E32ECB
902B3413EFA6
50E549ECBA1C
902B3457B16F
1C6F65296DF9
902B34131A14
50E549E3E2F8
50E5493A2696
902B345FB021
902B34131574


执行范例

[root@dating01 python]# cat aaa.py
#!/usr/bin/python
import re
a=open('ip.txt','r')
b=a.readlines()
for c in b:
    d=re.findall(r'.{2}',c)
    e='_'.join(d)
    print e
a.close


执行结果

[root@dating01 python]# python aaa.py
50_E5_49_E3_2E_CB
90_2B_34_13_EF_A6
50_E5_49_EC_BA_1C
90_2B_34_57_B1_6F
1C_6F_65_29_6D_F9
90_2B_34_13_1A_14
50_E5_49_E3_E2_F8
50_E5_49_3A_26_96
90_2B_34_5F_B0_21
90_2B_34_13_15_74