十、正则表达式和JSON

一、什么是正则表达式

正则表达式是一个特殊字符序列,一个字符串是否与我们所设定的这样的字符序列相匹配。

应用:快速检索文本、实现一些替换文本的操作

1、检查一串数字是否是电话号码

2、检查一个字符串是否符合email

3、把一个文本里指定的单词替换为另外一个单词

例:

a='C|C++|Java|C#|Python|Javascript'

判断a中是否包含Python

方法一:使用python内置方法

1) a.index('Python')>-1:

1 a='C|C++|Java|C#|Python|Javascript'
2 
3 if a.index('Python')>-1:
4     print(True)
5 else:
6     print(False)

2)'Python' in a

1 a='C|C++|Java|C#|Python|Javascript'
2 if 'Python' in a:
3     print(True)
4 else:
5     print(False)

方法二:使用正则表达式

 1 #coding=utf-8
 2 import re
 3 
 4 a='C|C++|Java|C#|Python|Javascript'
 5 r=re.findall('Python',a)
 6 print(r)
 7 if len(r)>0:
 8     print(u'字符串中包含Python')
 9 else:
10     print(u'字符串中不包含Python')

以上例子中‘Python’是常量字符串,几乎无意义。正则表达是的意义或者灵活即:规则

二、元字符与普通字符

a='C0C++7Java8C#9Python6Javascript'

查找a中所有的数字

1 #coding=utf-8
2 import re
3 a='C0C++7Java8C#9Python6Javascript'
4 r=re.findall('\d',a)
5 print(r)

总结:以上两个例子中Python是普通字符,\d是元字符

正则表达式是由一系列的普通字符和元字符所组成的

正则表达式有很多,在实际工作中根据需要查找即可

三、字符集

字符集由[]括起来的一组字符组合,字符之间是或者的关系,^代表非,-代表范围

字符集两边常常由普通字符构成,如‘a[cf]c’,普通字符a、c用来定界

 1 #coding=utf-8
 2 import re
 3 '''
 4 字符集的使用
 5 '''
 6 s = 'abc,acc,adc,aec,afc,ahc'
 7 #查找s中,中间一个字符是c或f的单词
 8 r=re.findall('a[cf]c',s)
 9 print(r)
10 
11 #查找s中,中间一个字符不是c也不是f的单词
12 r1=re.findall('a[^cf]c',s)
13 print(r1)
14 
15 #查找s中,中间一个字符是c\d\e\f的单词
16 r2=re.findall('a[c-f]c',s)
17 print(r2)

四、概括字符集

像\d、\D、\w这种具有高度概括的表达式,我们称为概括字符集

1 #coding=utf-8
2 import re
3 '''
4 概括字符集
5 '''
6 a='Python 1111Java678php'
7 # r=re.findall('[0-9]',a)
8 r=re.findall('\d',a)
9 print(r)

 五、数量词

数量词{}表示个数

如{3}表示3位;{3,6}表示最小3位,最大6位

 1 #coding=utf-8
 2 import re
 3 '''
 4 数量词{}
 5 '''
 6 a='Python  1111\nJava678php'
 7 #检索所有单词
 8 # r=re.findall('[a-z]{3}',a)
 9 #Python6位,Java4w位,php3位,所以取3到6位
10 r=re.findall('[a-zA-Z]{3,6}',a)
11 print(r)

六、贪婪与非贪婪

正则表达式默认是尽可能使用贪婪的匹配方式

非贪婪,后面加?

 1 #coding=utf-8
 2 import re
 3 '''
 4 贪婪与非贪婪
 5 '''
 6 a='Python  1111\nJava678php'
 7 #贪婪方式匹配
 8 r=re.findall('[a-zA-Z]{3,6}',a)
 9 print(r)
10 #非贪婪方式匹配
11 r1=re.findall('[a-zA-Z]{3,6}?',a)
12 print(r1)

七、匹配0次1次无限次

1 #coding=utf-8
2 import re
3 a='pytho0python1pythonn2'
4 r=re.findall('python*',a)
5 r1=re.findall('python+',a)
6 r2=re.findall('python?',a)
7 print(r)
8 print(r1)
9 print(r2)

关于?

1、作为非贪婪匹配方式?前面是范围

2、作为数量词?前面是普通字符

 1 #coding=utf-8
 2 import re
 3 a='pytho0python1pythonn2'
 4 
 5 r=re.findall('python{1,2}',a)
 6 r1=re.findall('python{1,2}?',a)
 7 r2=re.findall('python?',a)
 8 print(r)
 9 print(r1)
10 print(r2)

八、边界匹配符

例如:

1 #coding=utf-8
2 import re
3 
4 # qq='100001'
5 # qq='101'
6 qq='100000001'
7 #检查qq号码是否符合4-8位数字
8 r=re.findall('\d{4,8}',qq)
9 print(r)

使用正则表达式'\d{4,8}'可以检测出4-8位,小于4位,但是大于8位时,无法检测,正确做法是使用首尾匹配

1 #coding=utf-8
2 import re
3 
4 qq='100001'
5 # qq='101'
6 # qq='100000001'
7 #检查qq号码是否符合4-8位数字
8 r=re.findall('\d{4,8}$',qq)
9 print(r)

九、组

()小括号括起来的称为一组

1 #coding=utf-8
2 import re
3 a='PythonPythonPythonPythonPython*%%php'
4 #检测a中是否包含3个Python
5 r=re.findall('(Python){3}',a)
6 print(r)

十、匹配模式参数flag

findall(pattern, string, flags=0)方法中的第三个参数flags代表匹配模式
常用的匹配模式有

1 #coding=utf-8
2 import re
3 s = 'PythonC#\rJava\nPHP'
4 #使用re.I和re.S匹配模式,多个模式直接用|分隔
5 r=re.findall('c#',s,re.I|re.S)
6 print(r)
1 #coding=utf-8
2 import re
3 s = 'PythonC#\rJavaC#\nPHP'
4 #使用re.I和re.S匹配模式,多个模式直接用|分隔
5 r=re.findall('c#.{1}',s,re.I|re.S)
6 print(r)

十一、re.sub正则替换

1 #coding=utf-8
2 import re
3 
4 s='PythonC#JavaC#phpC#'
5 r=re.sub('C#','GO',s,2)
6 r1=s.replace('C#','GO',1)
7 print(r)
8 print(r1)
 

猜你喜欢

转载自www.cnblogs.com/loveapple/p/9328822.html