Python re模块 正则表达式(2)

在这里我要先说明一下 flags 的用法

re.A 或 re.ASCII   使用ASCII字符集进行匹配(不常用)  
re.I 或 re.IGNORECASE   忽略大小写匹配  
re.L 或 re.LOCALE  

使用当前预定字符类 \w \W \b \B \s \S

取决于当前区域设定(不常用)

 
re.U 或 re.UNICODE  

使用Unicode字符类 \w \W \b \B \s \S \d \D

取决于unicode定义的字符属性(不常用)

 
re.M 或 re.MULTILINE   多行匹配,使"^","$"可以在每一行中都进行匹配  
re.S 或 re.DOTALL   使 "." 可以匹配换行符"\r","\n"  
re.X 或 re.VERBOSE   去掉正则表达式中的所有空格符(不常用)  

1)re.findall(pattern, string, flags=0)

按照规则匹配整个字符串,返回匹配结果的列表

>>> re.findall(r"hello", "hello world hello")  # 普通匹配
['hello', 'hello']
>>> re.findall(r"^hello", "hello world hello")  # 匹配开头
['hello']
>>> re.findall(r"^hello", "hello world\nhello", flags=re.MULTILINE)  # 多行匹配开头
['hello', 'hello']
>>> re.findall(r"hello$", "hello world hello")  # 匹配结尾
['hello']
>>> re.findall(r"\d+", "aaa111bbb222ccc333")  # 匹配数字
['111', '222', '333']
>>> re.findall(r"\d{2}", "aaa111bbb222ccc333")  # 匹配两位的数字
['11', '22', '33']
>>> re.findall(r"ab|cd", "ab000cd00")  # 匹配"ab"或"cd"
['ab', 'cd']
>>> re.findall(r"\(", "ab(cd"))  # 匹配"("
['(']

>>> re.findall(r"(abc)+", "abcabcabc")  # 想要匹配多个"abc",使用分组时会优先把分组的内容返回
['abc']
>>> re.findall(r"(?:abc)+", "abcabcabc")  # 想要匹配多个"abc",(?:)把分组去掉,变成一个普通的字符串
['abcabcabc']

2)re.finditer(pattern, string, flags=0)

finditer与findall相似,只不过finditer返回一个迭代器,迭代器中每一个元素都是re.Match对象,通过group()可以获取值

r = re.finditer("hello", "hello world hello")
for i in r:
    print(i.group())

# 输出结果
hello
hello

3)re.search(pattern, string, flags=0)

search函数只返回第一个匹配到的结果,成功返回re.Match对象,否则返回None。

>>> re.search(r"hello", "hello world hello")
<_sre.SRE_Match object; span=(0, 5), match='hello'>  # 可以看到只返回了第一个"hello"
>>> re.search(r"hello", "hello world hello").group()
'hello'

>>> re.search(r"(abc) \1", "abc abc").group()  # \1 引用分组1的值
'abc abc'
>>> re.search(r"(?P<name>abc) (?P=name)", "abc abc").group()  # (?P=name) 引用分组别名"name"的值
'abc abc'

>>> re.search(r"(?P<name>zhansan) (?P<age>23)", "zhansan 23").group()
'zhansan 23'
>>> re.search(r"(?P<name>zhansan) (?P<age>23)", "zhansan 23").group(0)  # 分组0--即匹配的结果
'zhansan 23'
>>> re.search(r"(?P<name>zhansan) (?P<age>23)", "zhansan 23").group(1)  # 分组1的值
'zhansan'
>>> re.search(r"(?P<name>zhansan) (?P<age>23)", "zhansan 23").group(2)  # 分组2的值
'23'
>>> re.search(r"(?P<name>zhansan) (?P<age>23)", "zhansan 23").group("name")  # 分组别名name的值
'zhansan'
>>> re.search(r"(?P<name>zhansan) (?P<age>23)", "zhansan 23").group("age")  # 分组别名age的值
'23'

4)re.match(pattern, string, flags=0)

match从开始处进行匹配,成功返回re.Match对象,否则返回None。类似于于findall代码中的第3行

1 >>> re.findall(r"^abc", "abcooooo")
2 ['abc']
3 >>> re.match(r"abc", "abcooooo").group()
4 'abc'

5)re.sub(pattern, repl, string, count=0, flags=0)

sub按照给定的规则将string字符串中的相应的片段替换为repl,count 最多替换的次数,count=0默认为全部替换,返回替换后的字符串

1 >>> re.sub(r"\d+", "$", "aaa1bb2ccc333")  # 将连续的数字变成"$"
2 'aaa$bb$ccc$'

6)re.subn(pattern, repl, string, count=0, flags=0)

与sub相识,count 最多替换的次数,count=0默认为全部替换,返回 一个元组,下标0为替换后的字符串,下标1成功替换的次数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2ba7d088aa358a8b51971cc407691031.html