常用的正则符号(python)

常用的正则符号(python)

1. 原字符 指代直接存在于字符串内部的子串。


s1 = '通过几天Python的学习,感觉Python很简单,非常容易上手!'
re.findall('Python', s1)
#result ['Python', 'Python']

2.英文状态的句号. 指代任意字符(如数字、字母、标点符号、汉字等),但除了换行符\n。

# 提取出动力总成的值
s2 = '此次新朗逸主要搭载了1.5L和1.5T两种动力总成的发动机。别克英朗则搭载了1.0T和1.3T的动力总成。'
re.findall('1...',s2)
re.findall('1\...',s2)
#result ['1.5L', '1.5T', '1.0T', '1.3T']

3. 反斜杠 \

表示转义符,用于转换含义的符号。
\n:指代换行;
\t:指代Tab制表符;
\d:指代0~9中的任一数字;
\D:非数字;
\s:指代任意一种空白(如空格、Tab、换行等);
\s:非空白;
\w:指代字母、数字和下划线中的任意一种;
\W:指代特殊字符,即非字母,非数字,非汉字,非_
. :指代句号点本身;

# 剔除字符串中的所有空白
s3 = '   距离2019北京马拉松开跑只有两周时间了,\n 今年的北京马拉松预报名人数超过16万人,\t 媒体公布的中签率只有16%左右,再创历年来的新低。\n'
re.sub('\s','',s3)

# 取出所有含O字母的单词
string2  = 'Together, we discovered that a free market only thrives when there are rules to ensure competition and fair play, Our celebration of initiative and enterprise'

print(re.findall('\w*o\w*',string2, flags = re.I))
#result ['Together', 'discovered', 'only', 'to', 'competition', 'Our', 'celebration', 'of']

4.[] 指代字符集合,当需要特定字符匹配时,可以选择中括号

#exapmle 1
s4 = '用户联系方式:13612345566,用户编号为11011254321'
re.findall('1[356789]\d\d\d\d\d\d\d\d\d', s4)
# result['13612345566']


#example2
s5 = '通过对比新朗逸1.5L和1.5T两种动力在1.5年行驶期后的数据。发现1.5T的口碑相对较好!'
re.findall('1.5[a-zA-Z]',s5)
re.findall('1.5[TL]',s5)
#resulut ['1.5L', '1.5T', '1.5T']

5.英文状态的圆括号 () 指代特定内容的截取

s6 = 'id:1, name:Tom, age:3, gender:1; id:2, name:Lily, age:5, gender:0'
re.findall('\d',s6)
#result ['1', '3', '1', '2', '5', '0']
re.findall('age:\d',s6)
#result ['age:3', 'age:5']
re.findall('age:(\d)',s6)
['3', '5']

6.英文状态的问号? 表示匹配前一个字符0次或1次

string1 = "{ymd:'2018-01-01',tianqi:'晴',aqiInfo:'轻度污染'},
{ymd:'2018-01-02',tianqi:'阴~小雨',aqiInfo:'优'},
{ymd:'2018-01-03',tianqi:'小雨~中雨',aqiInfo:'优'},
{ymd:'2018-01-04',tianqi:'中雨~小雨',aqiInfo:'优'}"
print(re.findall("tianqi:'(.*?)'", string1))
#result ['晴', '阴~小雨', '小雨~中雨', '中雨~小雨']

7. + 表示匹配前一个字符一次及以上

# 邮箱地址的匹配
email1 = 'Lsxxx2011@163.com' 
email2 = '654088115@qq.com'
pattern = '[0-9a-zA-Z_\.\-]+@[a-zA-Z0-9_\-]+\.com'

8.* 表示匹配前一个字符0次及以上

# 提取出产品名称中含奶粉字样的产品
prod = ['婴儿袜','亨氏奶粉','奶粉勺','多功能奶瓶','幼儿奶粉量筒','磨牙棒']
res = []
for i in prod:
    res.extend(re.findall('.*奶粉.*',i))    
print(res)
#result ['亨氏奶粉', '奶粉勺', '幼儿奶粉量筒']

9.{} 表示匹配前一个字符特定的次数或范围

{m}: 匹配前一个字符m次;
{m,}:匹配前一个字符至少m次;
{m,n}:匹配前一个字符m~n次;
{,n}:匹配前一个字符至多n次;

# 手机号码的匹配
pattern = '1[356789]\d{9}' 
# 至少6个长度的密码 
pattern = '\w{6,}'
# 区号信息
pattern = '0\d{2,3}'

10.元字符 ^ 表示以什么开头,如果写到[]里面就是取反

str="匹配规则这个字符串是否匹配"
print(re.findall("^匹配规则",str)) #字符串开始位置与匹配规则符合就匹配且打印匹配内容,否则不匹配,返回值是list

#result['匹配规则']
str="匹配s规则这s个字符串是否s匹配f规则则re则则则"
print(re.findall("[^a-z]",str)) #反取,匹配出除字母外的字符,返回值是list

#result ['匹', '配', '规', '则', '这', '个', '字', '符', '串', '是', '否', '匹', '配', '规', '则', '则', '则', '则', '则']

11. 元字符$ 表示以什么结尾

str="匹配s规则这s个字符串是否s匹配f规则则re则则则"
print(re.findall("则$",str)) #字符串结束位置与则符合就匹配,否则不匹配,返回值是list
#result ['则']


str="匹配s规则这s个字符串是否s匹配f规则则re则则则1"
print(re.findall("则$",str)) #字符串结束位置与则符合就匹配,否则不匹配,返回值是list
#result []

12.元字符 r 将在python里有特殊意义的字符 比如转义字符\t \n,转换成原生字符(就是去除它在python的特殊意义),不然会给正则表达式造成冲突。

str1 = r'123\n456\t789'
str2 = '123\n456\t789'
print('str1:',str1)
print('str2:',str2)
#result str1: 123\n456\t789
#str2: 123
#456	789

13.正则匹配模式表

re.S(DOTALL) 使.匹配包含换行在内的所有字符
re.I(IGNORECASE) 使匹配对大小写不敏感
re.L(LOCAL) 做本地化识别匹配
re.M(MULTILINE) 多行匹配
re.X(VERBOSE) 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
re.U 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B

常用模块函数

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

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
match 返回的是一个<_sre.SRE_Match object; span=(0, 5), match=‘jilao’>对象,有四种处理办法。
·group() 以str形式返回对象中match的元素
·start() 返回开始位置
·end() 返回结束位置
·span() 以tuple形式返回范围

print(re.match('www', 'www.runoob.com').group()) # 在起始位置匹配
print(re.match('www', 'www.runoob.com').start())
print(re.match('www', 'www.runoob.com').end())
print(re.match('www', 'www.runoob.com').span()) 
print(re.match('com', 'www.runoob.com'))

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

re.search 扫描整个字符串并返回第一个成功的匹配。
匹配成功re.search方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
search返回的对象与match一样也要用那四种方法处理

print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())

(0, 3)
(11, 14)
line = "Cats are smarter than dogs";
 
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符 串,直到找到一个匹配。

3. re.findall(string[,pos[,endpos]])

string:待匹配的字符串;
pos:可选参数,指定字符串的起始位置,默认为0;
endpos:可选参数,指定字符串的结束位置,默认为字符串的长度;
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
match 和 search 是匹配一次 findall 匹配所有。

pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
 
print(result1)
print(result2)

['123', '456']
['88', '12']
4. re.finditer(pattern, string, flag=0)

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

it = re.finditer(r"\d+","12a32bc43jf3") 
for match in it: 
    print (match.group() )
    
12 
32 
43 
3
5.re.split(pattern, string[,maxsplit=0, flags=0])
>>> re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']
>>> re.split('(\W+)', ' runoob, runoob, runoob.') 
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
>>> re.split('\W+', ' runoob, runoob, runoob.', 1) 
['', 'runoob, runoob, runoob.']
 
>>> re.split('a*', 'hello world')   # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
['hello world']
6. re.sub(pattern, repl, string, count = 0, flag = 0)

pattern : 正则中的模式字符串。
repl: 替换的字符串,也可为一个函数。
string: 要被查找替换的原始字符串
count: 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

phone = "2004-959-559 # 这是一个国外电话号码"
 
# 删除字符串中的 Python注释 
num = re.sub(r'#.*$', "", phone)
print ("电话号码是: ", num)
 
# 删除非数字(-)的字符串 
num = re.sub(r'\D', "", phone)
print ("电话号码是 : ", num)

电话号码是:  2004-959-559 
电话号码是 :  2004959559
7. re.subn(pattern, repl, string, count=0, flags=0)

pattern:正则模型
repl:要替换的字符串
string: 要匹配的字符串
count:指定匹配的个数
flags:匹配模式
替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受

origin = "hello alex bcd alex lge alex acd 19"
a,b = re.subn("a","替换",origin) #替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受
print(a)
print(b)

#输出
# hello 替换lex bcd 替换lex lge 替换lex 替换cd 19
# 4
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值