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
转载于:https://blog.51cto.com/alwaysyunwei/1285294