python基础模块---re

import re

'''
.   匹配任意字符
[]  匹配[]出现的内容
[^...]  匹配不在[]出现的内容
\d  匹配数字
\D  匹配非数字
\s  匹配空白
\S  匹配非空白
\w  匹配字母,数字,下划线,汉字
\W  匹配非字母,非数字,非下划线,非汉字
^   匹配行首
$   匹配行尾
\A  匹配字符串的开头
\z  匹配字符串的结尾
\Z  字符串结束,有换行,则换行前结束
\b  匹配单词边界
\B  匹配非单词边界
\G  最后匹配完成的位置
a|b 匹配a或b
{n} 匹配n次
{n,}    匹配大于等于n次
{n, m}  匹配n到m次,包括n和m
*   匹配0次或多次
+   匹配1次或多次
?   匹配0次或一次
*?  匹配0次或多次,越少越少
+?  匹配1次或多次,越少越好
??  匹配0次或1次,越少越好
[0-9]   匹配0-9中的任意一个数字
[a-z]   匹配a-z中的任意一个字母
[A-Z]   匹配A-Z中的任意一个字母

备注:对于Python来说,默认是贪婪匹配,一个正则表达式做最大程度的匹配
'''

'''
re.match(pattern, string, flags=0)
    尝试从字符串的开始位置来匹配正则表达式,如果从开始位置匹配不成功,match() 函数就返回 None 。其中 pattern 参数代表正则表达式;
    string 代表被匹配的字符串;flags 则代表正则表达式的匹配旗标。该函数返回 _sre.SRE_Match 对象,该对象包含的 span(n) 
    方法用于获取第 n+1 个组的匹配位置,group(n) 方法用于获取第 n+1 个组所匹配的子串。
    match方法可以指定匹配的开始下标和结束下标
'''
test_str = 'hfhewkfsklsgjgegje'
pattern = re.compile('hfhe')
pattern1 = re.compile('fskl')
result = pattern.match(test_str)
print(pattern1.match(test_str, 6))
print(pattern1.match(test_str, 6, 10))
print(result.span())        # 获取匹配下标范围
print(result.group())       # 获取匹配结果
print(result.start())       # 获取匹配起始下标
print(result.end())         # 获取匹配结束下标
print(result.string)        # 获取被匹配的字符串


'''
re.search(pattern, string, flags=0)
    扫描整个字符串,并返回字符串中第一处匹配 pattern 的匹配对象。其中 pattern 参数代表正则表达式;string 代表被匹配的字符串;
    flags 则代表正则表达式的匹配旗标。该函数也返回 _sre.SRE_Match 对象。

match() 与 search() 的区别在于,match() 必须从字符串开始处就匹配,但 search() 可以搜索整个字符串
'''
test_str = 'hfhewkfsklsgjgegje'
pattern = re.compile('fskl')
result1 = pattern.search(test_str)
print(result1.group())


'''
re.findall(pattern, string, flags=0)
    扫描整个字符串,并返回字符串中所有匹配 pattern 的子串组成的列表。其中 pattern 参数代表正则表达式;string 代表被匹配的宇符串;
    flags 则代表正则表达式的匹配旗标。
'''
test_str = 'abcddfjsabcdfhewhfabcd'
pattern = re.compile('abcd')
result2 = pattern.findall(test_str)
print(result2)      # ['abcd', 'abcd', 'abcd']

'''
re.finditer(pattern, string, flags=0)
    扫描整个字符串,并返回字符串中所有匹配 pattern 的子串组成的迭代器,迭代器的元素是 _sre.SRE_Match 对象。
    其中 pattern 参数代表正则表达式;string 代表被匹配的字符串;flags 则代表正则表达式的匹配旗标。
'''
test_str = 'abcddfjsabcdfhewhfabcd'
pattern = re.compile('abcd')
result2 = pattern.finditer(test_str)
for i in result2:
    print(i.group())
    print(i.span())
# abcd
# (0, 4)
# abcd
# (8, 12)
# abcd
# (18, 22)

'''
re.fullmatch(pattem, string, flags=0)
    该函数要求整个字符串能匹配 pattern,如果匹配则返回包含匹配信息的 _sre.SRE_Match 对象;否则返回 None。
    fullmatch可以指定匹配的开始下标和结束下标
'''
test_str = 'hfsehfe'
pattern = re.compile('hfsehfe')
result = pattern.fullmatch(test_str)
print(result.group())   # hfsehfe
print(result.span())    # (0, 7)


'''
re.sub(pattern, repl, string, count=0, flags=0)
    该函数用于将 string 字符串中所有匹配 pattern 的内容替换成 repl;repl 既可是被替换的字符串,也可是一个函数。
    count 参数控制最多替换多少次,如果指定 count 为 0 ,则表示全部首换。默认为为0
'''
test_str = '2020-3-31'
patter = re.compile('-')
print(patter.sub('/', test_str))        # 2020/3/31

'''
re.split(pattem, string, maxsplit=0, flags=0)
    使用 pattern 对 string 进行分割,该函数返回分割得到的多个子串组成的列表。其中 maxsplit 参数控制最多分割几次。
    默认为0,表示全部分割
'''

test_str = '20,20-3-31'
pattern = re.compile('-|,')
print(pattern.split(test_str))


def fun(matched):
    # matched就是匹配对象,通过该对象的group()方法可获取被匹配的字符串
    value = "《基础" + (matched.group('lang')) + "教程》"
    return value


s = 'Python很好,Kotlin也很好'
# 将s里面的英文单词(用re.A旗标控制)进行替换
# 使用fun函数指定替换的内容
print(re.sub(r'(?P<lang>\w+)', fun, s, flags=re.A))       # 命名捕获组

'''
re.purge():清除正则表达式缓存。
'''
'''
re.escape()
    对模式中除 ASCII 字符、数值、下画线(_)之外的其他字符进行转义
    该方法有利于我们写正则表达式
'''
test_str = 'http://python.org'
tran_pattern = re.escape(test_str)  # http://python\.org
pattern = re.compile(tran_pattern)
print(pattern.fullmatch(test_str))

'''
捕获组
    在正则中使用(),就表示使用了捕获组
命名捕获组
    (?P<name>pattern)
'''
test_str ='python java golang php ruby erlang'
pattern = re.compile('(python).*?(golang).*?')
result = pattern.search(test_str)
print(result)       #<re.Match object; span=(0, 18), match='python java golang'>
print(result.group())       # 获取所有的内容 python java golang
print(result.group(0))      # 获取所有的内容 python java golang
print(result.group(1))      # 获取编号为1号的捕获组的内容 python
print(result.group(2))      # 获取编号为2号的捕获组的内容 golang
print(result.groups())      # 获取所有的捕获组的内容   ('python', 'golang')

test_str = 'http://python.org is a domain'
pattern = re.compile('(?P<prefix>python).*?(?P<suffix>org).*?')
result = pattern.search(test_str)
print(result.group())       # python.org
print(result.groups())      # ('python', 'org')
print(result.groupdict())   # {'prefix': 'python', 'suffix': 'org'}

'''
正则表达式的标志位:
    正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定
    re.I   忽略大小写
    re.M   多行匹配,影响^和$
    re.S   使.能够匹配包括换行符在内的所有内容
    re.X   忽略空格和 # 后面的注释
    re.U   Unicode解码,影响 \w, \W, \b, \B, \d, \D, \s, \S    如果设置了此re.UNICODE标志,就会影响到\w,\W,\b,\B,\d,\D,\s,\S的含义。
    re.L   本地化识别匹配,影响 \w, \W, \b, \B, \d, \D, \s, \S  如果添加了re.LOCALE这个标志,则:\w,\W,\b,\B,\s,\S的含义,和具体的locale相关。
'''
test_str = 'PYTHON is good!'
pattern = re.compile('python is good!', re.I)
print(pattern.fullmatch(test_str))      # <re.Match object; span=(0, 15), match='PYTHON is good!'>


test_str = '''Million nothing green human.
                Mission finally discover other social cut
                century. Provide argue political study while improve view.'''
pattern1 = re.compile('.*?(human).*?(study).*?', re.S)
print(pattern1.fullmatch(test_str))


test_str = 'python\ngo\njava'
pattern = re.compile('^\w+')
pattern1 = re.compile('^\w+', re.M)
print(pattern.findall(test_str))        # ['python']
print(pattern1.findall(test_str))       # ['python', 'go', 'java']


'''
零宽断言:用于查找特定内容之前或之后的内容,但并不包括特定内容本身。
对于零宽断言来说,最重要的一个概念是位置,零宽断言用于指定一个位置,这个位置应该满足一定的条件(它附近满足什么表达式),
并且这个位置不是字符(因此匹配返回无结果),仅仅是一个位置,因此它们也被称为零宽断言
零宽断言重点的这一个位置,是通过一个条件:这个位置附近(前或者后)存在或者不存在一个A(A可以是一个表达式)来决定的
    (?=exp) :此位置后面匹配表达式exp      正向前视断言
    (?!exp):此位置后面不匹配表达式exp     负向前视断言
    (?<=exp):此位置前面匹配表达式exp      正向后视断言   
    (?<!exp):此位置前面不匹配表达式exp    负向后视断言
    
正向,负向表示匹配不匹配的关系
前视,后视指定了是表示之前,还是表达式之后,前视表示表达式后面的位置,后视表示表达式前面的位置。将正则匹配
看做是对字段字符串的扫描,已经扫描的表示后面,所以称为后视,还没扫描的看做前面,所以叫做前视
'''
str = '<div>hello world</div>'
print(re.search('(?=he).*', str).group())       # hello world</div>
print(re.search('(?!he).*(?<=ld)', str).group())        # <div>hello world

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

推荐阅读更多精彩内容