python 正则表达式-字符

倖福魔咒の 提交于 2020-01-18 01:44:23

元字符

在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

常用元字符 说明
. 匹配除换行符以外的任意字符(当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。)
\w 匹配字母数字下划线汉字
\s 匹配任意的空白符 ,等价于 [\t\n\r\f]
\d 匹配任意数字,等价于 [0-9]
\b 匹配单词开始或末尾
^ 匹配字符串开始
$ 匹配字符串末尾

import re

str = '1个 demo 例子'

point = re.compile(r'.')
comment = re.compile(r'\w')
margin = re.compile(r'\s')
margin_2 = re.compile(r'\s例')
num = re.compile(r'\d')
word = re.compile(r'\bm')
word_2 = re.compile(r'\bd')
start = re.compile(r'^例子')
end = re.compile(r'例子$')
print('. :',point.findall(str))
print('\w :',comment.findall(str))
print('\s :',margin.findall(str), margin_2.findall(str))
print("\d :",num.findall(str))
print("\ b :",word.findall(str), word_2.findall(str))
print("^ :",start.findall(str))
print("$ :",end.findall(str))

# 输出结果
. : ['1', '个', ' ', 'd', 'e', 'm', 'o', ' ', '例', '子']
\w : ['1', '个', 'd', 'e', 'm', 'o', '例', '子']
\s : [' ', ' '] [' 例']
\d : ['1']
\ b : [] ['d']
^ : []
$ : ['例子']

限定符

指定数量的字符

常用限定符 说明
? 匹配前面的字符零次或一次
+ 匹配前面的字符一次或多次
* 匹配前面的字符零次或多次
{n} 匹配前面的字符n次
{n,} 匹配前面的字符最少n次
{n,m} 匹配前面的字符最少n次,最多m次
import re

str_2 = 'color'
que = re.compile(r'colou?r')
plus = re.compile(r'colo+r')
plus_u = re.compile(r'colou+r')
print('? :',que.findall(str_2))
print('+ :',plus.findall(str_2), plus_u.findall(str_2))
print('-'*30)
str_3 = 'zoo'
all = re.compile(r'zo*')
n = re.compile(r'zo{2}')
n_s = re.compile(r'zo{1,}')
n_s_2 = re.compile(r'zo{3,}')
n_m = re.compile(r'zo{1,3}')
n_m_2 = re.compile(r'zo{3,9}')
print('* :',all.findall(str_3))
print('{n} :',n.findall(str_3))
print('{n,} :',n_s.findall(str_3), n_s_2.findall(str_3))
print('{n,m} :',n_m.findall(str_3), n_m_2.findall(str_3))
# 输出结果
? : ['color']
+ : ['color'] []
------------------------------
* : ['zoo']
{n} : ['zoo']
{n,} : ['zoo'] []
{n,m} : ['zoo'] []

字符

[aeiou] :匹配任何一个英文元音字母;
[.?!] :匹配标点符号 “.”、“?”、“!”
[0-9] :相当于 \d
[a-z0-9A-Z] :在只考虑英文情况等同于 \w
[\u4e00-\u9fa5] :匹配字符串中的任意一个汉字
[\u4e00-\u9fa5] + :匹配连续多个汉字

排除字符

^ :在方括号中表示排除

import re

str = '1个 demo 例子'

exclude = re.compile(r'[^a-zA-Z]')
print('[^] :', exclude.findall(str))
# 输出结果
[^] : ['1', '个', ' ', ' ', '例', '子']

选择字符

| :选择字符。可以理解为“或”

# 匹配身份证号
(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$
# 说明
可以匹配15位或18位数字,或者17位数字和最后一位。最后一位可以是数字或X或x

转义字符

\ :转义字符,将特殊字符变为普通字符

str_4 = '(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$'
ip = '127.0.0.1'
ip_2 = '127000001'
esc_char_1 = r'[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
esc_char_2 = re.compile(r'[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
print('esc_char_1(ip):',re.findall(esc_char_1,ip))
print('esc_char_1(ip_2):',re.findall(esc_char_1,ip_2))
print('esc_char_2(ip):',esc_char_2.findall(ip))
print('esc_char_2(ip_2):',esc_char_2.findall(ip_2))
# 注:“.” 可以匹配一个任意字符,所以在该例子使用“.”时,需要使用转义字符(\)
# 输出结果
esc_char_1(ip): ['127.0.0.1']
esc_char_1(ip_2): ['127000001']
esc_char_2(ip): ['127.0.0.1']
esc_char_2(ip_2): []

分组

小括号作用:1. 改变限定符的作用范围。2. 分组

str_5 = 'January,February,March'
grouping = r'(Jan|Febr)uary'
grouping_s = r'(Jan|Feb)uary'
grouping_2 = r'Jan|February'
# 输出结果看起来是匹配 Jan|Feb,实际上是匹配January|February
print('grouping :',re.findall(grouping,str_5,re.I), re.findall(grouping_s,str_5,re.I))
print('grouping_2 :',re.findall(grouping_2,str_5,re.I))

# 输出结果
grouping : ['Jan', 'Febr'] ['Jan']
grouping_2 : ['Jan', 'February']

在Python 中使用正则表达式语法

在Python中使用正则表达式时,是将其作为模式字符串使用的。
匹配不是字母的一个字符的正则表达式:’[^a-zA-z]’
匹配以字母m开头的单词的 正则表达式转换为模式字符串,不能直接在其两侧添加引号定界符,而需要将“\”进行转义:

  1. 错误: ‘\bm\w*\b’
  2. 正确: ‘\bm\w*\b’

由于模式字符串可能包含大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加r或R。例如上面的模式字符串采用原生字符串表示: r’\bm\w*\b’
注:编写模式字符串时,并不是所有反斜杠都需要进行转换。如: “^\d{8}$” 。中的反斜杠不需要转义,因为其中的\d并没有特殊意义。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!