欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python中的正则表达式,python

程序员文章站 2022-07-13 21:29:51
...
# coding=utf-8
'''
Created on 2017年2月5日

@author: chenkai

就把正则表达式的相关内容到这里填充一下。 今天说说元字符是什么东西。 
\     ^    $   *    +     .    |    ?    {}    []    ()        
这就是元字符了,学会这些应该就够你用的了。
python中的正则表达式通过import re 来使用。
www.iplaypython.com python教程
'''
#正则表达式是引入re包
import re
s = r"abc" # 定义一个字符串规则,加r为了保持字符串愿意
text ="abcderg,bcdea,cba,abcd"
textre= re.findall(s, text)#re.findall可以获取字符串中所有匹配的字符串,本例表示在text中匹配"abc"
print textre#匹配结果为list列表


text2="top tip tcp ttp tpp tlp topit"
res=r"t[oci]p"
textre2=re.findall(res, text2)
print "匹配:%s"%textre2

res3=r"t[^oci]p"
textre3=re.findall(res3, text2)
print "取反:%s"%textre3

'''
[a-z]表示 从字母a到z所有的字母。 
[0-9]等价于[0123456789] 也可以用\d 表示。   所有其它的元字符在[]中将失去原有的意义,比如示例中的^在[]表示取反。 

2,^ 表示匹配字符串的开头。在多行模式下匹配每一行的开头。
注:^一般放在字符串开头 
'''
s2="hello world hello hello"
s3="a hello world hello "
ress2=r"^hello"
print re.findall(ress2, s2)
print re.findall(ress2, s3) # hello 不再开头 所以没有结果

'''
$ 表示匹配字符串的结尾。在多行模式下匹配每一行的尾部。
'''
s4="a hello world hello"
ress3=r"hello$"
print re.findall(ress3, s4)


'''
\反斜杠后面可以加不同的字符以表示特殊意义。 也可用于取消所有元字符,变为普通符号。
\d  匹配任何十进制数:相当于[0-9] 
\D 匹配任何非数字字符:相当于 [^0-9]
\s 匹配任何空白字符:相当于 [\t\n\r\f\v]
\S 匹配任何非空白字符:相当于 [^\t\n\r\f\v]
\w 匹配任何字母数字下划线字符:相当于[a-zA-Z0-9_]
\W 匹配任何非字母数字下划线字符:相当于[^a-zA-Z0-9_]   

'''
s111="hf_jadlfhj343 l 433 45jj h5 4 3 2 5kjh54354@#$%^__"
res111=r"\d"#取0-9
print re.findall(res111,s111)

res222=r"\D"#取非0-9
print re.findall(res222,s111)

res333=r"\s"#取空白符
print re.findall(res333,s111)

res444=r"\S"#取非空白符
print re.findall(res444,s111)

res555=r"\w" #取任何字母数字下划线字符
print re.findall(res555,s111)

res666=r"\W" #取任何非字母数字下划线字符
print re.findall(res666,s111)

'''
正则表达式可以匹配不定长的字符集,另外也可以指定字符串的重复次数。
* (星号) 指定前一个字符可以匹配0次或者多次,而不是只有1次,匹配结果会尽可能的重复多次最大不超过20亿次。
(后面若加问号?变为非贪婪模式仅匹配0次:ab*? 结果为a)
+ (加号)   匹配前一个字符1次或者多次。
(后面若加问号?变为非贪婪模式仅匹配1次:ab+? 结果为ab)
? (问号) 匹配前一个字符0次或者1次。
(后面若加问号?变为非贪婪模式仅匹配0次:ab?? 结果为a) ?可以是python原本的贪婪模式变为非贪婪模式。 
{m} (花括号) m是数字,表示重复前一个字符m次。
{m,n} 表示重复前一个字符m-n次。若省略m则表示0-n次,若省略n表示m到无限次。
(后面若加问号?变为非贪婪模式仅匹配0次:ab{2,100}? 结果为abb)
'''

tellphoneNumber="010-12345678 01067896523 010987654321 010-363636363636  0755-56859866"
restell = r"010-\d*" #\d表示[0-9] *表示重复0次或者无限次
print re.findall(restell,tellphoneNumber)

restell2 = r"010-\d+" #\d表示[0-9] +表示重复1次或者无限次
print re.findall(restell2,tellphoneNumber)


restell3 = r"010-?\d+" #\d表示[0-9] ?表示重复1次或者0次  在这里表示 “-” 字符可有可无
print re.findall(restell3,tellphoneNumber)

restell4 = r"010-?\d{8}" #\d表示[0-9] ?表示重复1次或者0次  在这里表示 “-” 字符可有可无 {8} 表示匹配到后面八位字符
print re.findall(restell4,tellphoneNumber) #11位电话号码,格式正确

#匹配开头是 3到4 为的电话号码
restell5 = r"\d{3,4}-?\d{8}" #\d表示[0-9] ?表示重复1次或者0次  在这里表示 “-” 字符可有可无 {8} 表示匹配到后面八位字符
print re.findall(restell5,tellphoneNumber) #11位电话号码,格式正确

'''
下面是个三个元字符。这三个在爬虫的正则表达式中常被用到,请爱它们。  
( )  |  .   . 它匹配除了换行字符外的任何字符,在 alternate 模式(re.DOTALL)下它甚至可以匹配换行 

| 代表左右表达式任意匹配一个。a|b 匹配a或者匹配b 。   如果没有被(...)括起来它的范围是整个正则表达式。
 
(...) 将正则表达式分组,每个分组为一个整体,将优先返回分组内的数据。   接下来我们来匹配一个玩蛇网的title html代码
'''
html=" <title>玩蛇网论坛-Python编程开发主题学习社区 -  Powered by Discuz!</title> "
rest=r"<title>(.+)</title>"
print re.findall(rest,html)

s666="qiaodaimababiekanle"
res666=r"a|i" #匹配a或i
print re.findall(res666,s666)