Python学习第五天

来源:互联网 发布:淘宝客批量申请定向 编辑:程序博客网 时间:2024/05/16 04:48
# 正则表达式
# 5.2 案例研究:街道地址
s='100 NORTH MAIN ROAD'        
s=s.replace('ROAD','RD.')          # 1、字符串替换
print (s)

s='100 NORTH BROAD ROAD'
s=s.replace('ROAD','RD.',1)
print (s)

s[:-4]+s[-4:].replace('OAD','E')   # 1、字符串替换

import re
re.sub('ROAD$','RD',s)             # 2、字符串替换
'''
参考网址:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
正则表达式:

1.表示字符串开始:^
2.表示字符串结束:$
3. \b :意思是“在右边必须有一个分隔符”
4. 'r':字符串中没有任何字符需要转义
5. '?'表示匹配前面字符0次或1次
'''
s='100 BROAD'
print (re.sub('ROAD$','RD.',s))
print (re.sub('\\bROAD$','RD.',s))
print (re.sub(r'\bROAD$','RD.',s))
s='100 BROAD ROAD APT.3'
print (re.sub(r'\bROAD$','RD.',s))
print (re.sub(r'\bROAD\b','RD.',s))

# 5.3 研究罗马数字      规则蛋疼啊
'''
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
'''
# 5.3.1 检查千位数
print ("检查千位数")
pattern='^M?M?M?$'
print (re.search(pattern,'M'))
print (re.search(pattern,'MM'))
print (re.search(pattern,'MMM'))
print (re.search(pattern,'MMMM'))
print (re.search(pattern,''))           # 匹配0次

# 等价
pattern='^M{0,3}$'
print (re.search(pattern,'M'))
print (re.search(pattern,'MM'))
print (re.search(pattern,'MMM'))
print (re.search(pattern,'MMMM'))
print (re.search(pattern,''))

# 5.3.2 检查百位数
print ("检查百位数")
'''
100 = C            200 = CC
300 = CCC          400 = CD
500 = D            600 = DC
700 = DCC          800 = DCCC
900 = CM
'''
'''
可能的匹配模式:
CM
CD
可能有0到3个字符C(0个表示千位为0)。
D紧跟在0到3个字符C的后面
'''
pattern='^M?M?M?(CM|CD|D?C?C?C?)$'
print (re.search(pattern,'MCM'))
print (re.search(pattern,'MD'))
print (re.search(pattern,'MMMCCC'))
print (re.search(pattern,'MCMC'))
print (re.search(pattern,'MCD'))
print (re.search(pattern,''))
print (re.search(pattern,'DCCC'))

# 等价
pattern='^M{0,3}(CM|CD|D{0,1}C{0,3})$'
print (re.search(pattern,'MCM'))
print (re.search(pattern,'MD'))
print (re.search(pattern,'MMMCCC'))
print (re.search(pattern,'MCMC'))
print (re.search(pattern,'MCD'))
print (re.search(pattern,''))
print (re.search(pattern,'DCCC'))

# 检查十位和个位
print ("检查十位和个位")
pattern='^M{0,3}(CM|CD|D{0,1}C{0,3})(XC|XL|L{0,1}X{0,3})$'
print (re.search(pattern,'MCMXL'))
print (re.search(pattern,'MCML'))
print (re.search(pattern,'MCMLX'))
print (re.search(pattern,'MCMLXXX'))
print (re.search(pattern,'MCMLXXXX'))

# 5.5 松散正则表达式
'''
需要传递 re.VERBOSE
1、空白符被忽略。空格、制表符和回车在正则表达式中并不会匹配空格、制表符、回车。如果你想在正则表达式中匹配他们,可以在前
面加一个\来转义。
2、注释信息被忽略。松散正字表达式中的注释和python代码中的一样,都是以#开头直到行尾。它可以在多行正则表达式中增加注释信
息,这就避免了在python代码中的多行注释。他们的工作方式是一样的。
'''
pattern = '''
^         # 字符串开始
M{0,3}    # 千位
(CM|CD|D{0,1}C{0,3})  # 百位
(XC|XL|L{0,1}X{0,3})  # 十位
(IX|IV|V?I{0,3})      # 个位
$                     # 结束符
'''
print ("松散正则表达式")
print (re.search(pattern,'M',re.VERBOSE))               # re.VERBOSE表示使用松散正则表达式
print (re.search(pattern,'MCMLXXXIX',re.VERBOSE))
print (re.search(pattern,'MMMDCCCLXXXVIII',re.VERBOSE))
print (re.search(pattern,'M'))                          # 没有 NONE

# 5.6 案例研究:解析电话号码
'''假设可接受的电话号码格式:

800‐555‐1212
800 555 1212
800.555.1212
(800) 555‐1212
1‐800‐555‐1212
800‐555‐1212‐1234
800‐555‐1212x1234
800‐555‐1212 ext. 1234
work 1‐(800) 555.1212 #1234
'''
phonePattern =re.compile(r'^(\d{3})‐(\d{3})‐(\d{4})$')   # \d 代表任意的数字 0~9,{3}代表我要打三个
print(phonePattern.search('800‐555‐1212'))

phonePattern =re.compile(r'^(\d{3})\D+(\d{3})\D+(\d{4})\D+(\d+)$')   # \D 非数字字符,+ 匹配前面字符1次或更多次, \D+ 表示1个以上非数字字符
print(phonePattern.search('800‐555‐1212 #1234'))

phonePattern =re.compile(r'^(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$')   # \D 非数字字符,* 匹配前面字符任意次, \D+ 表示任意个非数字字符
print(phonePattern.search('80055512121234'))
print(phonePattern.search('800.555.1212.1234'))
print(phonePattern.search('8005.551.2121.234'))

phonePattern =re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$')     #  不限制开始的位置
print(phonePattern.search('aaaa 80055512121234'))
print(phonePattern.search('work 1‐(800) 555.1212 #1234'))

'''
^ 匹配字符串开始位置。
$ 匹配字符串结束位置。
\b 匹配一个单词边界。
\d 匹配一个数字。
\D 匹配一个任意的非数字字符。
x? 匹配可选的x字符。换句话说,就是0个或者1个x字符。
x* 匹配0个或更多的x。
x+ 匹配1个或者更多x。
x{n,m} 匹配n到m个x,至少n个,不能超过m个。
(a|b|c) 匹配单独的任意一个a或者b或者c。
(x) 这是一个组,它会记忆它匹配到的字符串。你可以用re.search返回的匹配对象的groups()函数来获取到匹配的值
打完收工!!!
'''
0 0
原创粉丝点击