Python学习第七天----- 正则表达式
什么是正则表达式?
正则表达式是一个特殊的字符序列,用于检测一个字符串是否与我们所设定的这样的字符序列相匹配。
那么,正则表达式的作用呢?
举个例子:
1. 检查一串数据是否是电话号码。
2. 检测一个字符串是否符合email
3.把一个文本中指定的单词替换成另一个单词
... ...
内置函数:
在python中有一些内置函数可以实现一些字符串匹配,例如index()可以用来判断一些内容是否在序列中存在,当然也可以通过in来查找。
正则表达式正篇:
python提供了re模块,他就是python的正则表达式模块儿。在re模块儿中存放着正则所需要的函数和它的一些属性。如findall, search等。、
import re a = 'C|C++|Python|C#|Javascript|Java' result = re.findall('Python', a) print(result) # 结果是 # ['Python']
判断是否存在:
if len(result) != 0: print('字符串中包含Python')
查询是否存在数字:
import re a = 'C0C++7Python8C#6Javascript9Java' result = re.findall('\d', a) print(result)
结果是:
['0', '7', '8', '6', '9']
1. 元字符与普通字符:
字符串指的普通字符,而元字符指的# . ^ $ * + ? {} [] \ | (),\d等等。
2.字符集: []
中括号内的字符表示或的关系,即匹配任意其中一个。而^在其中,则表示范围取反。
3.概括字符集:(常用)
字符
|
含义
|
备注
|
\d
|
数字匹配
|
|
\D
|
匹配非数字
|
|
\w
|
匹配字母数字下划线
|
|
\W
|
匹配非字母数字下划线
|
|
\s
|
空白字符
|
|
\S
|
非空白字符
|
|
.
|
匹配除换行符\n以外的所有字符
|
如果设置了re.S,则表示匹配所有的字符,包括换行符
|
4.数量词
import re a = 'python 11111java68php' r = re.findall('[a-z]{3}', a) print(r) #['pyt', 'hon', 'jav', 'php'] r1 = re.findall('[a-z]{3,6}', a) print(r1) #['python', 'java', 'php']
注意,后一个表达式匹配的不是pyt和hon,而是python,即在数量词上匹配尽可能大的数字个数。也就是贪婪匹配。
其他数量词:
表示
|
含义
|
备注
|
*
|
表示0次或无限多次
|
|
+
|
1次或无限多次
|
|
?
|
匹配0次或者1次
|
作为数量词,与非贪婪匹配的概念还是不一样的
|
5.贪婪匹配和非贪婪匹配
匹配默认是贪婪匹配,用?来表示非贪婪匹配。
r2 = re.findall('[a-z]{3,6}?', a) print(r2) #['pyt', 'hon', 'jav', 'php']
6.边界匹配
字符
|
含义
|
备注
|
^
|
必须以此作为匹配字符串的开始
|
如‘^000’表示匹配以000作为开头的字符串
|
$
|
必须以此作为匹配字符串的结束
|
7.组 ()
例子:
import re a = 'PythonPython0PythonPythonPythonPython' r = re.findall('(Python){3}', a) print(r) #['Python']
8. re.findall的三个参数
第一个是正则str
第二个是被匹配的字符串,
第三个参数:re.I 表示忽略大小写,多个模式之间用 | 进行分隔,表示几个模式同时使用。
字符
|
含义
|
备注
|
re.I
|
忽略大小写
|
|
re.S
|
对于匹配字符串种的.表示匹配所有的字符,包括\n
|
可参考下面示例8-1或概括字符集
|
import re language = 'PythonC#JavaPHP' r = re.findall('c#.{1}', language, re.I | re.S) print(r) #['C#J']
上边正则表达式表示匹配c#,其后是任意字符,包括\n
9.re.sub正则替换
第四个参数flag = 0表示默认的将所有的C#替换,flag = 1表示只替换匹配到的第一个字符串
import re language = 'PythonC#JavaPHPC#JavaPHP' r = re.sub('C#', 'GO', language, 0) print(r) #PythonGOJavaPHPGOJavaPHP
内置函数replace
上边代码改用replace的方法进行替换。
r = language.replace('C#', 'GO') print(r) #PythonGOJavaPHPGOJavaPHP
函数在re.sub中的使用:
import re language = 'PythonC#JavaPHPC#JavaPHP' def convert(value): pass #flag = 0表示默认的将所有的C#替换 r = re.sub('C#', convert, language, 1) print(r) #PythonJavaPHPC#JavaPHP
当re.sub中第二个参数是一个函数的时候,如果匹配到'C#',则将匹配的结果传到函数中作为参数,函数返回的结果去替换匹配到的内容。
import re language = 'PythonC#JavaPHPC#JavaPHP' def convert(value): print(value) #flag = 0表示默认的将所有的C#替换 r = re.sub('C#', convert, language)
打印的结果是:
说明返回的不只有匹配到的内容,还有span(匹配到的内容的位置)
import re language = 'PythonC#JavaPHPC#JavaPHP' def convert(value): matched = value.group() print(matched) return '!!' + matched + '!!' #flag = 0表示默认的将所有的C#替换 r = re.sub('C#', convert, language) print(r)
打印的结果:
C# C# Python!!C#!!JavaPHP!!C#!!JavaPHP
10.re.match和re.search
import re s = 'SD21F2S1F2SD1F1DSF5514' r = re.match('\d', s) print(r) r1 = re.search('\d', s) print(r1) #None #<re.Match object; span=(2, 3), match='2'>
match将尝试从字符串的首位开始匹配,如果匹配不上,则返回None,一旦匹配到,就将匹配结果给返回.而search搜索整个字符串,一旦找到第一个匹配的字符串,就马上将匹配的结果返回。修改s
s = '21F2S1F2SD1F1DSF5514' r = re.match('\d', s)
返回的结果是:
<re.Match object; span=(0, 1), match='2'>
打印匹配的结果:
print(r.group()) #2
通过.span()可以获取到匹配的位置
print(r.span()) #(0, 1)
与re.findall对比:
r2 = re.findall('\d', s) print(r2) #['2', '1', '2', '1', '2', '1', '1', '5', '5', '1', '4']
re.findall反回了所有的匹配的结果。
11.group分组
import re s = 'life is short, i use python' r = re.search('life(.*)python', s) print(r.group(0)) #group(0)永远记录的是完整的匹配结果 #life is short, i use python print(r.group(1)) #group(1)则是分组的第一组 # is short, i use
用findall来看看
r = re.findall('life(.*)python', s) print(r) #[' is short, i use ']
但是多分组呢?
s = 'life is short, i use python, i love python' r = re.findall('life(.*)python(.*)python', s) print(r) #[(' is short, i use ', ', i love ')]
如果用search
import re s = 'life is short, i use python, i love python' r = re.search('life(.*)python(.*)python', s) print(r) print(r.group(0)) print(r.group(1)) print(r.group(2)) # <re.Match object; span=(0, 42), match='life is short, i use python, i love python'> # life is short, i use python, i love python # is short, i use # , i love
当然我们可以使用groups()来查看匹配结果。
print(r.groups()) #(' is short, i use ', ', i love ')
此时会返回匹配到的括号中的字符
关于正则表达式的建议:
1.正则表达式可以帮助我们完成一些字符串内置函数无法 完成的功能,提高工作效率
2.正则表达式不是python独有的,且大部分主流语言都有正则表达水。(在我看来,除了关键字和部分细节,在语法和功能上都与javascript的正则相似)。由于python的应用场景(爬虫,数据处理与分析等),使得正则显得尤为重要
3.查找常用正则表达式,如果这个表达式在你的系统上运行良好,不妨多花些时间去 研究一下。
JSON
JSON是一种轻量级的数据交换格式
优点:
易于解读,易于解析,网络传输效率高
JSON的反序列化:
python内置了json模块儿。
import json json_str = '{"name":"qiyue", "age":18}' student = json.loads(json_str) print(type(student)) print(student) print(student['name']) print(student['age']) # <class 'dict'> # {'name': 'qiyue', 'age': 18} # qiyue # 18
如果JSON是一個数组的话:
import json json_str = '[{"name": "qiyue", "age": 18},{"name": "dongsheng", "age": 22} ]' student = json.loads(json_str) print(type(student)) print(student)
JSON序列化:
import json student = [ {'name': 'qiyue', 'age': 18, 'flag':False}, {'name': 'dasheng', 'age': 1500} ] json_str = json.dumps(student) print(type(json_str)) print(json_str) #<class 'str'> #[{"name": "qiyue", "age": 18, "flag": false}, {"name": "dasheng", "age": 1500}]