第二章 基本库使用之正则表达式

常用正则表达式匹配规则

模式 描述
\w 匹配字母、数字、下划线,等价于[a-zA-Z0-9_] \w可以匹配汉字(python)
\W 匹配不是字母、数字、下划线的其他字符
\s 匹配任意空白字符,等价于(\t\n\r\f)
\S 匹配任意非空字符
\d 匹配数字,等价于[0-9]
\D 匹配不是数字的字符
\A 匹配字符串开头
\Z 匹配字符串结尾的,如果存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结尾的,如果存在换行,匹配到换行符\n
\G 最好完成匹配的位置
\n 匹配一个换行符
\t 匹配一个制表符(tab)
^ 匹配一行字符串的开头
$ 匹配一行字符串的结尾
. 匹配任意字符,除了换行符.当re.DOTALL标记被指定时,这可以匹配包括换行符在内的任字符
[…] 用来表示一组字符,比如[abc]表示匹配a或b或c,[a-z],[0-9]
[^…] 匹配不在[]里面的字符,比如[^abc]匹配除a,b,c以外的字符
* 匹配0个或多个字符
+ 匹配1个或多个字符
? 匹配0个或1个前面的正则表达式片段,(.*?)表示尽可能少地匹配字符(后面详解)
{n} 精确匹配前面n个前面的表达式,如\d{5}表示匹配5个数字
{n,m} 匹配前面的表达式n到m次,贪婪模式
a b
(…) 匹配括号里的表达式,也可以表示一个组

  • match()
    给match()方法传入要匹配的字符串和正则表达式,可以检测这个正则表达式是否和字符串相匹配。
    他会从字符串的起始位置开始匹配正则表达式,如果匹配就返回匹配的结果,如果不匹配就返回None.
    也就是说match()会关注字符串的开头是否和表达式匹配,意味着一旦开头不匹配就失败了
import re
content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
print(result)
print (result.group())
print(reslut.span())
  • match('正则表达式', '要匹配的字符串')
  • group():输出匹配到的内容 "Hello 123 4567 World_This"
  • span():输出匹配的字符串在原字符串的位置范围 "(0,25)"
  • group(1):输出匹配到的内容中第1个被()包围的匹配结果

贪婪与非贪婪

import re
content = 'Hello 123 4567 World_This is a Regex Demo'
result1 = re.match('^He.*(\d+).*Demo$',content)
result2 = re.match('^He.*?(\d+).*Demo$',content)
print(result1.group(1))
print(result1.group(2))

result1 输出的结果是7,因为前面的 .* 是贪婪策略,会把前面123456都匹配去了,只剩下一个7
result2 输出的结果是1234567,因为前面的 .* 加了一个?表示非贪婪匹配。
但是需要注意如果在末尾使用费贪婪可能匹配不到任何结果。为减少匹配结果却是的情况,在字符串中间尽可能使用非贪婪代替默认的贪婪匹配。

修饰符

  • re.I :不区分大小写
  • re.L :本地化识别匹配
  • re.M :多行匹配,影响 ^ 和 $
  • re.S :式匹配内容包括换行符在内的所有字符
  • re.U:根据Unicode字符集解析字符,影响 \w 、\W 、\b 、\B
  • re.X:更灵活的正则格式
    转义符:\
  • search():和match()差不多,返回与正则表达式匹配的第一个字符串,但不需要开头匹配,表达式在匹配字符串中间也可以。

绝大部分HTML文本包含换行符,所以需要加上re.S

  • findall:获取与正则表达式匹配的所有字符串,返回结果是列表类型。

findall()返回的是括号所匹配到的结果,多个括号就会返回多个括号分别匹配到的结果,如果没有括号就返回就返回整条语句所匹配到的结果

  • sub:可以用来修改文本,比如将符合表达式的字符串都替换或删除操作,可以简化原匹配字符串
  • compile:将正则字符串编译成表达式对象,以便在后面的匹配中复用。
import re
content1 = '2019-12-15 12:00'
content2 = '2019-12-19 11:00'
content3 = '2019-12-17 14:00'

pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)

以上是将三个日期分别删掉时间,可以用一个compile去定义时间的正则表达式,然后用sub来去掉。

你可能感兴趣的:(第二章 基本库使用之正则表达式)