4.14 re 模块

本节重点:

  • 使学员掌握re模块的使用

本节时长需控制在50分钟内

引子

请从以下文件里取出所有的手机号

姓名        地区    身高    体重    电话
况咏蜜     北京    171    48    13651054608
王心颜     上海    169    46    13813234424
马纤羽     深圳    173    50    13744234523
乔亦菲     广州    172    52    15823423525
罗梦竹     北京    175    49    18623423421
刘诺涵     北京    170    48    18623423765
岳妮妮     深圳    177    54    18835324553
贺婉萱     深圳    174    52    18933434452
叶梓萱    上海    171    49    18042432324
杜姗姗   北京    167    49       13324523342

你能想到的办法是什么?

必然是下面这种吧?

有没有更简单的方式?

手机号是有规则的,都是数字且是11位,再严格点,就都是1开头,如果能把这样的规则写成代码,直接拿规则代码匹配文件内容不就行了?

这么nb的玩法是什么?它的名字叫正则表达式!

re模块

正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re

常用的表达式规则

re的匹配语法有以下几种

  • re.match 从头开始匹配

  • re.search 匹配包含

  • re.findall 把所有匹配到的字符放到以列表中的元素返回

  • re.split 以匹配到的字符当做列表分隔符

  • re.sub 匹配字符并替换

  • re.fullmatch 全部匹配

re.compile(pattern, flags=0)

Compile a regular expression pattern into a regular expression object, which can be used for matching using its match(), search() and other methods, described below.

The sequence

is equivalent to

but using re.compile() and saving the resulting regular expression object for reuse is more efficient when the expression will be used several times in a single program.

re.match(pattern, string, flags=0)

从起始位置开始根据模型去字符串中匹配指定内容,匹配单个

  • pattern 正则表达式

  • string 要匹配的字符串

  • flags 标志位,用于控制正则表达式的匹配方式

Flags标志符

  • re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)

  • M(MULTILINE): 多行模式,改变'^'和'$'的行为

  • S(DOTALL): 改变'.'的行为,make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.

  • X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样

re.search(pattern, string, flags=0)

根据模型去字符串中匹配指定内容,匹配单个

re.findall(pattern, string, flags=0)

match and search均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。

re.sub(pattern, repl, string, count=0, flags=0)

用于替换匹配的字符串

相比于str.replace功能更加强大

re.split(pattern, string, maxsplit=0, flags=0)

re.fullmatch(pattern, string, flags=0)

整个字符串匹配成功就返回re object, 否则返回None

练习:

1.验证手机号是否合法

2.验证邮箱是否合法

3.开发一个简单的python计算器,实现加减乘除及拓号优先级解析

  • 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

hint:

Last updated

Was this helpful?