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}]

 

posted @ 2020-12-05 11:16  游丝飘榭  阅读(118)  评论(0编辑  收藏  举报