python正则

文章目录

  • 正则表达式
    • 1.修饰符
    • 2.字符
    • 3.数量
    • 4.分组
    • 5.re模块
      • findall
      • match
      • search
      • sub
      • split
      • finditer

正则表达式

1.修饰符

re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 忽略空白和注释,允许使用 ’#’ 来引导一个注释
import re

res1 = re.search(r'[a-z]+','liqiang110qasq').group()
print(res1)  # liqiang
res2 = re.search(r'[a-z]+','LiQiangNlkj110qasq', re.I)
res3 = res2.group()
print(res2)  # 
print(res3)  # LiQiangNlkj

2.字符

\w 匹配字母数字
\W 非字母数字
\s 任意空白字符[\t\n\r\f]
\S 非空字符
\d 任意数字[0-9]
\D 非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’
\B 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’
\n 匹配一个换行符
\t 匹配一个制表符
\1…\9 匹配第n个分组的子表达式
import re

b = r"(abcabc)\1"
a = r"(a)(b)(c)\2"
# 一个括号就是一个组,\n选定指定次序n组的元素
# "(ab)(cd)(ef)\1"就是"(ab)(cd)(ef)(ab)"
# "(ab)(cd)(ef)\2"就是"(ab)(cd)(ef)(cd)"
match1 = re.match(a,'abcbabcd').group()
print(match1) # abcb

3.数量

^ 匹配开头
$ 匹配末尾
. 除了换行符的任意字符。当re.DOTALL指定时,则可匹配包括换行符的任意字符
[…] [amk] 匹配 ‘a’或’m’或’k’
[^…] [^abc] 匹配除了a,b,c之外的字符
* 匹配0个或多个
+ 1个或多个
? 0个或1个,非贪婪方式
{ n} 匹配n个
{ n,} 多于n个
{ n, m} n 到 m 次,贪婪方式
a b
() 匹配括号内的表达式,也表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志,re:表达式
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#…) 注释

4.分组

import re

text = "元芳,你怎么看 [email protected][email protected]给个手机号,以后好联系15131255789,过年来玩15131266666呀"
# 返回匹配后加括号的内容
# 先忽略括号,整体匹配,然后以括号为组进行返回
data_list = re.findall("15(13)1(2\d{5})", text)
print(data_list)  # [('13', '255789'), ('13', '266666')]

5.re模块

findall

获取匹配到的所有数据

match

起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None

import re

text = "15131255789元芳,你怎么看 [email protected][email protected]给个手机号,以后好联系,过年来玩15131266666呀"

data_list = re.match("15(13)1(2\d{5})", text)
print(data_list)  # 

search

匹配字符串,返回第一个匹配的。否则,返回None

import re

text = "元芳,你怎么看 [email protected][email protected]给个手机号,以后好联系15131255789,过年来玩15131266666呀"

data_list = re.search("15(13)1(2\d{5})", text)
print(data_list)  # 

sub

替换匹配成功的位置

import re

text = "15131255789,15131266666"

data_list = re.sub("15(13)1(2\d{5})","号码", text)
print(data_list)  # 号码,号码

split

根据匹配成功的位置分割

import re

text = "999881513125578945455,1513126666687878"

data_list = re.split("151312",text)
print(data_list)  # ['99988', '5578945455,', '6666687878']

finditer

与findall类似。不同的是可以分组标记返回字典值
(?P\d{4})

import re

text = "kjio422202201502135219k51352318620314521Xtg"
#匹配身份证,把年月日标记后返回
data_list = re.finditer("\d{6}(?P\d{4})(?P\d{2})(?P\d{2})\d{3}[\d|X]", text)
for item in data_list:
    info_dict = item.groupdict()
    print(info_dict)
# {'year': '2015', 'month': '02', 'day': '13'}
# {'year': '1862', 'month': '03', 'day': '14'}

你可能感兴趣的:(python,正则表达式,前端,后端)