美文网首页
Python_Re库(正则表达式)

Python_Re库(正则表达式)

作者: 听不听不听 | 来源:发表于2020-04-22 18:05 被阅读0次

正则表达式(一行胜千言)

正则表达式(Regular Expression)又称规则表达式,是计算机科学领域的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。以下介绍Python中Re库基本内容与使用方法:

  • raw string和string类型
  • 基本语法规则
  • 主要功能函数
  • match对象及其属性
  • 修饰符
  • 正则表达式应用案例

1.raw string和string类型

正则表达式有两种表示类型:raw string(原生字符串类型)和string类型。
raw string类型是不包含转义符 \ 的字符串,表示为r'text',例如r'[1-9]\d{5}'
string类型是包含转义符的字符串,表示为'text',因此使用更加繁琐,在使用某些包含斜杠的元字符时需要增加转义符,例如:'[1-9]\\d{5}'

2.基本语法规则

(1)元字符

匹配位置的元字符

^ $ \b
匹配开头 匹配结尾 匹配开头或结尾
“^abc”匹配以“abc”开头的字符串 “abc$”匹配以“abc”结尾的字符串 r“abc\b”匹配以“abc”开始或者结尾的单词

注:
“^abc$”匹配以“abc”开始和结尾的字符串。
\b不匹配空格、标点符号或换行符号。
匹配字符的元字符

. \W \s \S \d \D
匹配除换行之外的任意字符 匹配单词字符 匹配任意非单词字符 匹配任意的空白字符 匹配任意的非空白字符 匹配任意的非数字字符
(2)字符类

字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。字符类可以在方括号“[]”中定义。

例如:[012345]可以匹配数字0到5中的任意一个;[0-9]等价于[0123456789],可匹配任何一个数字。

连字符“-”
如果要在字符类中包含连字符“-”,则必须包含在第一位,例如:[-a]表示表达式匹配-或者a。

否定字符“^”
如果^是字符类的第一个字符表示否定该字符串,也就是匹配该字符串外的任意字符。例如:[^abc]匹配除了abc以外的任意字符;

反/转义字符“\”
在查找元字符本身的时,例如,查找“.”或者“*”时,需要使用“\”转义符来取消这些字符的特殊意义。

限定符

字符 功能
* 零次或多次
+ 一次或多次
? 零次或一次
*? 尽可能少的使用重复的第一个匹配
+? 尽可能少的使用重复但至少使用一次
?? 如果有可能使用零次重复或一次重复
{n} 匹配确定的n次
{n,} 至少匹配n次
{n,m} 最少匹配n次且最多匹配m次

注:m和n均为非负整数

(3)懒惰匹配和贪婪匹配

原始字符串: PYANBNCNDN
懒惰匹配正则表达式: PY.?N
懒惰匹配结果: PYAN
贪婪匹配正则表达式: PY.
N
贪婪匹配结果:PYANBNCNDN

(4)两种表达方式

图片来源:中国大学慕课《Python网络爬虫与信息提取》

3.主要功能函数


图片来源:中国大学慕课《Python网络爬虫与信息提取》

示例如下:

import re
#匹配第一个
match = re.search(r'[1-9]\d{5}','BIT 100081 TSU100084')
if match:
    print("search:",match.group(0))
    print(match.re)

search: 100081

import re
#re.match从首字母匹配第一个
match1 = re.match(r'[1-9]\d{5}','BIT 100081')
if match1:
    print(match1.group(0))
match2 = re.match(r'[1-9]\d{5}','100081')
if match2:
    print("match2:",match2.group(0))

match2: 100081

import re
#匹配所有
ls = re.findall(r'[1-9]\d{5}','BIT 100081 TSU100084')
print("ls:",ls)

ls: ['100081', '100084']

import re
#分割
print("split:",re.split(r'[1-9]\d{5}','BIT 100081 TSU100084'))
print("split_maxsplit=1:",re.split(r'[1-9]\d{5}','BIT 100081 TSU100084',maxsplit=1))

split: ['BIT ', ' TSU', '']
split_maxsplit=1: ['BIT ', ' TSU100084']
注:maxsplit可以指定分割次数

import re
#finditer
for m in re.finditer(r'[1-9]\d{5}','BIT 100081 TSU100084'):
    if m:
        print("finditer",m.group(0))

finditer 100081
finditer 100084

import re
sub替换正则表达式匹配的旧字符串
sub = re.sub(r'[1-9]\d{5}',':zipcode','BIT 100081 TSU100084')
print('sub:',sub)

sub: BIT :zipcode TSU:zipcode

4.match对象属性及方法


图片来源:中国大学慕课《Python网络爬虫与信息提取》

5.修饰符


图片来源:中国大学慕课《Python网络爬虫与信息提取》

6.正则表达式应用案例

电子邮箱匹配

#电子邮箱匹配
import re
pattern='[a-zA-Z0-9_-]+@+[a-z0-9A-Z]+\.(com|cn|net)'
email1='whuer123@123.com'
email2='小明123@123.com'
email3='whuer123@12'
result=re.match(pattern,email1)
if result:
    print(email1, '匹配')
else:
    print(email1, '不匹配')
result=re.match(pattern,email2)
if result:
    print(email2, '匹配')
else:
    print(email2, '不匹配')
result=re.match(pattern,email3)
if result:
    print(email3, '匹配')
else:
    print(email3, '不匹配')

whuer123@123.com 匹配
小明123@123.com 不匹配
whuer123@12 不匹配

相关文章

网友评论

      本文标题:Python_Re库(正则表达式)

      本文链接:https://www.haomeiwen.com/subject/axkwihtx.html