python正则表达式总结

"""author = 陈俊龙"""

==============正则表达式符号============

re模块主要提供正则相关的方法

import re

1.什么是正则

正则是匹配字符串的一直工具,拥有自己的语法,语法中包含各种符号的使用

2.正则语法

re.fullmatch(正则表达式,字符串) -
检测字符串是否完全符合正则规则(完全匹配)

如果匹配成功返回匹配对象,如果匹配失败结果返回None

正则表达式 - python中的正则表达式是写在引号中的内容,可以是单引号,也可以是双引号,但是一般会在引号前加r, r'正则表达式'

3.匹配符号

1)普通字符 - 除了正则中有特色功能和特殊意义以外的其他所以字符

例如:a,b,c,123,~,你....

普通字符在正则表达式中就表示字符本身

re_str = r'abc'
res = re.fullmatch(re_str, 'abc')
print(res)  # <_sre.SRE_Match object; span=(0, 3), match='abc'>

2).(点) - 匹配任意一个字符

正则中出现点.的位置可以匹配任意字符(一个点匹配一个任意字符)

re_str = r'a..c'  # 匹配一个长度是4的字符串,以a开头,c结尾,中间任意两个字符
res = re.fullmatch(re_str, 'a4cc')
print(res)  # <_sre.SRE_Match object; span=(0, 4), match='a4cc'>

3)\w - 匹配任意一个字母,数字,下划线(只针对ASCII码有效)用得较少!

re_str = r'a\wc.'
res = re.fullmatch(re_str, 'a_c6')
print(res)  # <_sre.SRE_Match object; span=(0, 4), match='a_c6'>

4)\s - 匹配一个空白字符

空白字符:空格,回车/换行,制表符

re_str = r'a\sc.'
res = re.fullmatch(re_str, 'a\nc6')
print(res)  # <_sre.SRE_Match object; span=(0, 4), match='a\nc6'>

5) \d - 匹配一个数字字符

re_str = r'a\dc'
res = re.fullmatch(re_str, 'a6c')
print(res)  # <_sre.SRE_Match object; span=(0, 3), match='a6c'>

6) \大写字母 - 匹配\小写字母取反的类容

\W - 匹配非数字,字母下划线
\S - 匹配非空白字符
\D - 匹配非数字字符

re_str = r'a\D\S\Wc'
res = re.fullmatch(re_str, 'a#A#c')
print(res)  # <_sre.SRE_Match object; span=(0, 5), match='a#A#c'>

7) [ ] - 匹配字符集 注意:一个中括号只匹配一个字符

a.普通用法

[字符集] - 匹配字符集中的任意一个字符
例如:
[az1+] - 表示匹配一个字符是中括号中的任意一个字符
[\dabc] - 表示匹配一个数字或者a b c 中的一个字符

b.表示范围的字符集

[字符1-字符2] - 匹配字符1到字符2中的任意一个字符,注意,字符2的编码值必须大于字符1
例如:
[5-9] - 匹配5到9中的任意一个字符
[a-zA-Z] - 匹配任意一个字母
[a-zA-Z\d_] - 匹配字母,数字,下划线

c.表示反向选中[^字符集] - 表示选中除了字符集中以外的其他任意一个字符

任意字符实例:

re_str = r'[abc\d]bc'
res = re.fullmatch(re_str, 'cbc')
print(res)

范围实例:

re_str = r'[a-zA-Z\d_]bc'
res = re.fullmatch(re_str, '2bc')
print(res)

反向实例:

re_str = r'[^a-zA-Z\d_]bc'
res = re.fullmatch(re_str, '#bc')
print(res)

4.检测符号

注意:
一个匹配符号必须对应一个具体字符,而检测符号只是对符号所在位置进行检查,不会影响字符串长度

1)\b - 检测是否是单词边界

单词边界:
一切可以将两个单词区分开的符号都是单词边界,例如单词开头,单词结尾,空白,标点符号等....

print(re.fullmatch(r'how\b are', 'how are'))

2) ^ - 检查^所在位置是否是字符串开头

print(re.fullmatch(r'^how are', 'how are'))
print(re.search(r'^are', 'are234'))

3) $$ - 检查$所在位置是否是字符串结尾

print(re.search(r'\dare$', '123are234are'))  # 如果不加后面$会匹配到3are

==============正则表达式符号2===========

import re

1.匹配次数:

* - 匹配星号*前的字符0次或多次

+ - 匹配加号+前的字符1次或多次

?- 匹配问号?前的字符0次或1次

print(re.fullmatch(r'[abc]*', 'aaa'))
print(re.fullmatch(r'[abc]+', 'a'))
print(re.fullmatch(r'[+-]?\d+', '12345'))

{}

{N} - 匹配n次
{M,N} - 匹配m到n次
{M,} - 匹配至少m次
{,N} - 匹配至多N次

print(re.fullmatch(r'a{2}bc', 'aabc'))
print(re.fullmatch(r'a{3,5}bc', 'aaaabc'))
print(re.fullmatch(r'a{3,}bc', 'aaaaaaaaabc'))
print(re.fullmatch(r'a{,5}bc', 'aaaaabc'))

练习:

判断用户名和密码是否合法,用户名要求必须有数字字母下划线,且长度6-20位

print(re.fullmatch(r'[A-Za-z\d_]{6,20}', 'chenjunlong1995'))
print(re.fullmatch(r'[1-9]\d{4,11}', '900000'))

贪婪模式和非贪婪模式:

,+,?,{}对应的匹配次数都是贪婪的,在匹配次数不确定的情况下才有贪婪和非贪婪的区分
在匹配次数不确定的符号后面加?,就会变成非贪婪:
?,+?,??,{m,n}?

贪婪模式:在匹配成功的前提下,尽可能多的进行匹配

非贪婪:在匹配成功的前提下,尽可能少的匹配

贪婪模式实例

result = re.search(r'.+b', '123basdb222b')
print(result)  # match='123basdb222b'>

非贪婪模式实例

result = re.search(r'.+?b', '123basdb222b')
print(result)  # match='123b'

分之

正则表达式1 | 正则表达式2

print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', 'ZZZ'))

需求:一个字符串最开头是三个数字或者三个小写字母,后面大写字母 分组实例:

print(re.fullmatch(r'(\d{3}|[a-zA-Z]{3})[A-Z]+', 'asdBB'))

4. 分组()

分组() - 将正则中的一部分看成一个整体进行操作
重复 - 添加分组后,可以在分组的后面加上\M来重复前面的第M个分组匹配到的结果

分组实例:

print(re.fullmatch(r'(\d\d:)+\d\d', '19:29:90:88'))

重复实例:

print(re.fullmatch(r'(\d+)abc\1', '12abc12'))
print(re.fullmatch(r'(\d+)([a-z])abc\2', '12aabca'))
print(re.fullmatch(r'(\d+)\1([a-z])abc\2', '1212aabca'))

5.转义符号 - 在正则符号前加反斜杠\让符号的功能消失

正则中的转义符号和字符串的转义字符串是两回事

第二种转义方式:

单独的特殊符号放在[]中括号中特殊意义也会消失

转义字符实例:

print(re.fullmatch(r'\.a', '.a'))
print(re.fullmatch(r'\d\+\d', '3+3'))

中括号转义的实例:

print(re.fullmatch(r'[.]a', '.a'))
print(re.fullmatch(r'\d[+]\d', '3+3'))
print(re.fullmatch(r'[.+*][+]\d', '++3'))
print(re.fullmatch(r'[15-]\d', '-2'))
print(re.fullmatch(r'[a\]]\d', '\6'))  # 匹配不了?????????????

=================re模块==============

import re

1.创建正则对象

compile(正则表达式) - 根据正则表达式创建正则对象

2.匹配

fullmatch(正则表达式,字符串) - 让整个字符串和正则表达式进行匹配(完全匹配)

match(正则表达式,字符串) - 让正则表达式的开头和正则表达式进行匹配

返回值:匹配成功是匹配结果对象,匹配失败是None

print(re.match(r'[1-9]{3}', '11111111111'))  # match='111'>

匹配结果

1)能取到匹配结果对应的字符串

匹配对象.group() - 获取整个正则匹配到的结果

匹配对象.group(N) - 获取第n个分组匹配到的结果

获取匹配结果实例:

result = re.match(r'[1-9]{3}', '11111111111')
print(result.group())  # 111
# 取第二个分组匹配到的结果实例:
result = re.match(r'([1-9])([123])', '12')
print(result.group(2))  # 2

2)获取匹配位置:

匹配对象.span() - 获取匹配匹配结果在字符串中的开始和结束下标

匹配对象.span(N)
匹配对象.start()
匹配对象.end()

3).获取原字符串

匹配对象.string - 获取原来的字符串

3.查找

search(正则表达式,字符串) -

匹配出字符串中第一个满足正则表达式的子串,结果是匹配对象

findall(正则表达式,字符串) -

获取字符串中所有满足正则表达式的字串,结果是一个列表,列表中的元素是字符串

finditer(正则表达式,字符串) -

获取字符串中所有满足正则表达式的字串,结果是一个迭代器,迭代器的元素是匹配对象

result = re.search(r'\d{3}', '123ashdahdb76438hbbd')
print(result.group())  # 123

result = re.findall(r'\d{3}', '123ashdahdb76438hbbd')
print(result)  # ['123', '764']

4.切割

split(正则表达式,字符串) -

按照满足正则表达式的字串对字符串进行切割,返回的是列表
可以使切割更加灵活

str1 = 'aaa0bbb0ccc0ddd'
print(str1.split('0'))  # ['aaa', 'bbb', 'ccc', 'ddd']
# 灵活切割实例
str1 = 'aaa01bbb03ccc05ddd'
print(re.split('\d+',str1))  #  ['aaa', 'bbb', 'ccc', 'ddd']

5.替换

sub(正则表达式,字符串1,字符串2,替换次数=0) -

将字符串2中满足正则表达式的字串替换成字符串1,替换次数为0时全部替换

str1 = 'aaa01bbb03ccc05ddd'
print(re.sub('\d+', '+', str1))  # aaa+bbb+ccc+ddd
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容