Python正则表达式

正则表达式基本符号使用

>>> import re
>>> re.findall(r'a.','abc')
['ab']

>>> re.findall(r'^ab','abc')
['ab']

>>> re.findall(r'bc$','abc')
['bc']

>>> re.findall(r'abc*','abcccc')
['abcccc']

>>> re.findall(r'abc+','ab')
[]
>>> re.findall(r'abc+','abccc')
['abccc']

>>> re.findall(r'abc{2}','abcc')
['abcc']

>>> re.findall(r'abc{2,4}','abccc')
['abccc']

>>> re.findall(r'abc{1,3}?','abccc')
['abc']

>>> re.findall(r'abc?','abcdef')
['abc']

>>> re.findall(r'abc?','abc')
['abc']

>>> re.findall(r'abc*?','abcc')
['ab']

>>> re.findall(r'abc+?','abcc')
['abc']

>>> re.findall(r'abc??','abcc')
['ab']

>>> re.findall(r'1\.2','1.2')
['1.2']

>>> re.findall(r'a[ab]c','abcd')
['abc']

>>> re.findall(r'abc|def','abcdef')
['abc', 'def']

>>> re.findall(r'a(bc)','abcdef')
['bc']

>>> re.findall(r'pythonre(?#注释)','pythonretest')
['pythonre']

#只和它之前的字符串组合
>>> re.findall(r'abc(?=def)','abcdef')
['abc']

#只和它之后的字符串组合
>>> re.findall(r'(?<=abc)def','abcdef')
['def']

# abc后面跟的不是def,返回前面的字符串
>>> re.findall(r'abc(?!def)','abcgdef')
['abc']
>>> re.findall(r'(?!def)ab','defgab')
['ab']

>>> re.findall(r'(?:a)(b)','ab')
['b']

特殊转义字母

特殊表达式序列 说明
\A 只在字符串开头进行匹配。
\b 匹配位于开头或者结尾的空字符串
\B 匹配不位于开头或者结尾的空字符串
\d 匹配任意十进制数,相当于 [0-9]
\D 匹配任意非数字字符,相当于[^0-9]
\s 匹配任意空白字符,相当于 [ \t\n\r\f\v]
\S 匹配任意非空白字符,相当于 [^ \t\n\r\f\v]
\w 匹配任意数字和字母,相当于 [a-zA-Z0-9_]
\W 匹配任意非数字和字母的字符,相当于 [^a-zA-Z0-9_]
\Z 只在字符串结尾进行匹配

贪婪与非贪婪

贪婪符号* + ?这些符号会在符号的功能基础上会尽可能的匹配到最长的字符串。

非贪婪.? *? +? {n,m}?等与贪婪符号相反会尽可能的匹配最短长度的字符串。

findall方法

获取所有匹配的字符串,以list返回

re.findall(pattern, string, [flags])

修饰符(flags) 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
>>> re.findall(r'ab','abcabcabc')
['ab', 'ab', 'ab']

# 当匹配到第一个'aba'时,指针在'b'的位置,所以不会匹配到中间的'aba'
>>> re.findall(r'aba','abababa')
['aba', 'aba']

>>> re.findall(r'ab.*?d','''ab
... cdef''')
[]
# 使用修饰符的作用,使得'.'可以匹配换行的字符。
>>> re.findall(r'ab.*?d','''ab
... cdef''',re.S)
['ab\ncd']

finditer方法

返回一个顺序访问每一个匹配结果(Match对象)的迭代器

finditer(pattern, string[, flags])

>>> result = re.finditer(r'ab.','abcabd')
>>> for e in result:
...     print(e.group())
...
abc
abd

re.match和re.search

只获取匹配的第一个字符串

import re

# 从字符的第一个字母开始对比,如何发现与规则不符合返回None。
result1 = re.match(r'abc','defabc')
print(result1)
result2 = re.match(r'abc','abcdef')
# 获取正则式中的第一组的数据,组号需要一一对应,默认第0组。
print(result2.group())
# 开始匹配的位置
print(result2.start())
# 结束匹配的位置
print(result2.end())
# (开始位置,结束位置)
print(result2.span())
None
abc
0
3
(0, 3)
# 从字符串中获取第一个匹配的字符串,之后停止匹配。
result3 = re.search(r'abc','defabc')
# 获取正则式中的第一组的数据,组号需要一一对应,默认第0组。
print(result3.group(0))
abc

sub和subn方法

替换匹配的字符串

# 替换匹配的字符串
>>> re.sub(r'\d+','num','12 ok 34 ok 56 ok')
'num ok num ok num ok'
# 替换匹配的字符串并返回替换的次数。
>>> re.subn(r'\d+','num','12 ok 34 ok 56 ok')
('num ok num ok num ok', 3)

split方法

分割字符串

split(pattern, string, maxsplit=0)

# 默认分割全部
>>> re.split(r'\d+','32dsfa234sdfa565sdafhs3452')
['', 'dsfa', 'sdfa', 'sdafhs', '']

# 只分割2次
>>> re.split(r'\d+','32dsfa234sdfa565sdafhs3452',2)
['', 'dsfa', 'sdfa565sdafhs3452']

# 匹配多行和忽略大小写来匹配分割
>>> re.split(r'[a-z]+','1ABc2cdE3FhH4',re.M,re.I)
['1', '2', '3', '4']

参考:https://www.cnblogs.com/yyyg/p/5498803.html

posted @ 2019-08-27 11:15  会走的树  阅读(171)  评论(0编辑  收藏  举报