python正则

正则表达式

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)  # <re.Match object; span=(0, 6), match='liuyaN'>
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 次,贪婪方式
ab
()匹配括号内的表达式,也表示一个组
(?imx: re)在括号中使用i, m, 或 x 可选标志,re:表达式
(?-imx: re)在括号中不使用i, m, 或 x 可选标志
(?#…)注释

4.分组

import re

text = "元芳,你怎么看 3841359@qq.com和984654@189.com给个手机号,以后好联系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元芳,你怎么看 3841359@qq.com和984654@189.com给个手机号,以后好联系,过年来玩15131266666呀"

data_list = re.match("15(13)1(2\d{5})", text)
print(data_list)  # <re.Match object; span=(0, 11), match='15131255789'>

search

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

import re

text = "元芳,你怎么看 3841359@qq.com和984654@189.com给个手机号,以后好联系15131255789,过年来玩15131266666呀"

data_list = re.search("15(13)1(2\d{5})", text)
print(data_list)  # <re.Match object; span=(48, 59), match='15131255789'>

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<year>\d{4})(?P<month>\d{2})(?P<day>\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'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值