python re 模块

方法 含义
compile(正则表达式) 编译正则表达式,创建正则表达式对象
fullmatch(正则表达式,字符串) 让整个字符串和正则表达式进行匹配
match(正则表达式,字符串) 匹配字符串开头
匹配对象.group() 获取整个正则表达式匹配的结果
匹配对象.group(分组号) 获取正则表达式中指定的分组匹配到的结果(分组号从1开始)
匹配对象.span() 获取匹配到的子串范围
匹配对象.string 获取原字符串
search(正则表达式,字符串) 在字符串中查找第一个能和正则表达式匹配的子串。如果找到了返回匹配对象,找不到返回None
findall(正则表达式,字符串) 获取字符串中所有满足正则表达式的子串。返回一个列表,列表中的元素是字符串
finditer(正则表达式,字符串) 获取字符串中所有满足正则表达式的子串。返回一个迭代器,迭代器中的元素是匹配对象
split(正则表达式, 字符串, 次数) 指定切割次数
sub(正则表达式, 字符串1, 字符串2, 次数) 限制替换次数

1、compile(正则表达式) - 编译正则表达式,创建正则表达式对象

from re import compile, fullmatch, match, search, findall, finditer, split, sub
from re import IGNORECASE, MULTILINE, DOTALL, S
# 1. re.compile()

re_obj = compile(r'\d{3}')

fullmatch(r'\d{3}', '234')
re_obj.fullmatch('234')

search(r'\d{3}', 'hu23hjk890jhkh78')
re_obj.search('hu23hjk890jhkh78')

2.匹配

  • 1)fullmatch(正则表达式, 字符串) - 让整个字符串和正则表达式进行匹配
  • 2)match(正则表达式, 字符串) - 匹配字符串开头
    如果匹配不到结果是None,如果匹配成功了结果是匹配对象
  • 3)(?i) - 正则表达式前面加(?i)表示忽略大小写
  • 4)(?s)-正则表达式前面加(?s)表示单行匹配
  • 5)(?is)-单行匹配并忽略大小写
re_str = r'\d{3}'
print(fullmatch(re_str, '732'))
print(fullmatch(re_str, '732hjas'))   # None
print(match(re_str, '789'))
print(match(re_str, '789j手机打开'))

# 设置同时忽略大小写和单行匹配
print(fullmatch(r'123.[a-z]{3}', '123\nHNA', flags=S|IGNORECASE))
print(fullmatch(r'(?is)123.[a-z]{3}', '123\nHNA'))

3.匹配对象

  • 1)匹配对象.group() - 获取整个正则表达式匹配到结果
  • 2)匹配对象.group(分组号) - 获取正则表达式中指定的分组匹配到的结果(分组号从1开始)
  • 3)匹配对象.span() - 获取匹配到的子串的范围
  • 4)匹配对象.string - 获取原字符串
result = match(re_str, '789j手机打开')
re_str = r'(\d{2})-([a-z]{3})'
result = match(re_str, '23-sjm回款及时发货')
print(result)
# 1)获取匹配到的字符串
# 匹配对象.group()   -  获取整个正则表达式匹配到结果
print(result.group())    # 23-sjm

# 匹配对象.group(分组号)  - 获取正则表达式中指定的分组匹配到的结果(分组号从1开始)
print(result.group(1))   # 23
print(result.group(2))   # sjm

# 2)获取匹配到的子串的范围
# 匹配对象.span()
print(result.span())     # (0, 6)
print(result.span(2))    # (3, 6)

# 3)获取原字符串
# 匹配对象.string
print(result.string)

4.查找

  • 1)search(正则表达式,字符串) - 在字符串中查找第一个能和正则表达式匹配的子串。如果找到了返回匹配对象,找不到返回None
  • 2)findall(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串。返回一个列表,列表中的元素是字符串
  • 3)finditer(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串。返回一个迭代器,迭代器中的元素是匹配对象
str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
result = search(r'\d+', str1)
print(result)    # 

result = findall(r'\d+', str1)
print(result)    # ['123', '123', '456', '98', '7', '123']

result = findall(r'\d+[a-z]', str1)
print(result)   # ['123a', '456k', '7h', '123o']

# findall正则中如果有分组,只获取分组匹配到的内容
result = findall(r'(\d+)[a-z]', str1)
print(result)     # ['123', '456', '7', '123']

result = findall(r'(\d+)([a-z])', str1)
print(result)   # [('123', 'a'), ('456', 'k'), ('7', 'h'), ('123', 'o')]

str2 = '9h3jabc===9k2mabc9293h0oabc==!!!'
result = findall(r'(\d[a-zA-Z]){2}abc', str2)
print(result)


result = finditer(r'((\d[a-zA-Z]){2})abc', str2)
# print(list(result))
for x in result:
    print(x.group(1))

5.切割

  • split(正则表达式, 字符串) - 将字符串中能和正则表达式匹配的子串作为切割点,对字符串进行切割。返回值是列表,列表中的元素是字符串

  • split(正则表达式, 字符串, 次数) - 指定切割次数

str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
result = split(r'\d+', str1)
print(result)    # ['and', '=hu', 'aaa', 'klk', '!ll', 'hu', 'oop']

result = split(r'\d+', str1, 3)
print(result)     # ['and', '=hu', 'aaa', 'klk98!ll7hu123oop']

6.替换

  • sub(正则表达式, 字符串1, 字符串2) - 将字符串2中能和正则表达式匹配的子串全部替换成字符串1
  • sub(正则表达式, 字符串1, 字符串2, 次数) - 限制替换次数
str1 = 'and123=hu123aaa456klk98!ll7hu123oop'
new_str1 = sub(r'\d+', '+', str1)
print(new_str1)

sentence = '你丫是傻 叉吗? 我操你大爷的. F u c k you.'
re_str = r'(?i)[操肏艹草曹]|f\s*u\s*c\s*k|s\s*h\s*i\s*t|傻\s*[比屄逼叉缺吊屌]|煞\s*笔'
new_sentence = sub(re_str, '*', sentence)
print(new_sentence)

你可能感兴趣的:(python re 模块)