Python正则

====================
正则表达式:
专门用来匹配字符串的一个工具,通过我们自己去制定匹配的规则
正则表达式独立于任何的编程语言之外

如何在python中使用正则表达式
1 导入re库
2 定义正则规则以及需要匹配的字符串
3 进行效验得到结果

import re

# 定义需要匹配的字符串
str1 = 'hello python hello world'

# 定义匹配规则
# result = re.findall('hello',str1)
result = re.findall('kehao',str1)
print(result)

=====================
正则表示字符

字符 功能
. 匹配任意1个字符(除了\n)
[] 匹配[]中列举的字符 只能匹配一个字
\d 匹配数字,即0-9 [0-9]
\D 匹配非数字,即不是数字 [^0-9] '^'否定
\s 匹配空白,即 空格, tab键
\S 匹配非空白
\w 匹配单词字符,即a-z,A-Z,0-9,_ [a-zA-Z0-9_]
\W 匹配非单词字符 [^a-zA-Z0-9_]

re.match(正则规则,匹配的字符串)
1 从左往右进行匹配,如果符合规则,返回对象,如果没有匹配上返回None
可以使用group查看匹配的字符串
2 group() 将匹配到的内容提取出来(从左往右获取第一 次匹配到的内容)
import re

# # 定义字符串
# str1 = 'my name is kehao,nice to meet you'
#
# # 定义匹配规则
# result = re.match('my',str1)
# print(result.group())

# .
# print(re.match('.....','my name is kehao,nice to meet you'))
# print(re.match('.....','my\nname is kehao,nice to meet you'))

# []
# print(re.match('[my]','my English is very good'))
# print(re.match('[qwe]','qwe123'))
# print(re.match('[139]','9123456'))
# print(re.findall('[320]','9123456'))

# \d
# print(re.match('\d','hello666'))
# print(re.findall('\d\d\d','hello666'))


# \D
# print(re.match('\D','hello666'))
# print(re.match('\D','666hello'))

# \s
# print(re.match('\s','qwe 123'))
# print(re.match('\s',' qwe123'))

# \S
# print(re.match('\S','qwe 123'))
# print(re.match('\S',' qwe123'))

# \w
# print(re.match('\w','python666'))
# print(re.match('\w','6python666'))
# print(re.match('\w','_6python666'))
# print(re.match('\w','&6python666'))

# \W
# print(re.match('\W','&6python666'))

# 17674331793
print(re.match('\d\d\d\d\d\d\d\d\d\d\d','17674331793'))
print(re.match('1[3456789]\d\d\d\d\d\d\d\d\d','17674331793'))
print(re.match('1[3-9]\d\d\d\d\d\d\d\d\d','17674331793'))

==================
字符        功能
* 匹配前一个字符出现0次或者无限次,即可有可无 {,}
+ 匹配前一个字符出现1次或者无限次,即至少有1次 {1,}
? 匹配前一个字符出现1次或者0次,即要么1次,要么没有 {0,1}
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
import re
# *
# print(re.match('.*','abcdefg123456'))
# print(re.match('.*','abcdefg\n123456'))
# print(re.match('\d*','hello666')) # 'hello666' ''+'hello666'

# +
# print(re.match('.+','asd123nvhsa6'))
# print(re.match('[a-z]+','asd123nvhsa6'))
# print(re.findall('\d+','asd123nvhsa6'))

# ?
# print(re.match('.?','qwe123python666'))
# print(re.match('\d?','qwe123python666'))
# print(re.findall('\d?','qwe123python666'))

print(re.match('.*[0-9]','qwe123'))
# print(re.match('.+[0-9]','qwe123'))
# print(re.match('.?[0-9]','qwe123'))

# {}
# print(re.match('\w{3}','my name is kehao')) # 匹配一个单词符3次
# print(re.match('\w{2}','my name is kehao'))
# print(re.match('\w{2,}','myname is kehao')) # 匹配一个单词符至少2次
# print(re.match('\w{2,6}','mynameis kehao')) # 匹配一个单词符至少2-6次

# 手机号 17674331793
print(re.match('\d*','17674331793'))
print(re.match('\d{11}','17674331793456'))
print(re.match('1[3-9]\d{9}','17674331793456'))

==========================
字符     功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
import re
# ^
# print(re.findall('^1[9]\d{9}','13198745455'))
# print(re.findall('1[9]\d{9}','13198745455'))
# $
# print(re.findall('^1[9]\d{9}$','13198745455'))


# \b 单词边界,左右没用(数字,字母,下划线)
print(re.match(r'\w+.\bqian\b','moran qian qiu'))
print(re.match(r'.+\bchuan\b','mo chuan'))

# \B
print(re.match(r'.+\Bchuan\B','mochuang'))

=======================
字符        功能
| 匹配左右任意一个表达式 | = 或
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
import re

str1 = 'hello12+29^*&30-18'

# result = re.match(r'\w{5}\d+\+\d+[^a-zA-Z0-9_]+\d+-\d+',str1)
result = re.match(r'\w{5}(\d+\+\d+)[^a-zA-Z0-9_]+(\d+-\d+)',str1)
# print(result)
print(result.group(1))
print(result.group(2))

result = re.findall('\d+\+\d+|\d+-\d+',str1)
# result = re.findall('\w+(\d+\+\d+)|.+(\d+-\d+)',str1)
print(result)

==========================
match()

findall


search 方法:从字符串中查找一个字符串,如果符合要求返回第一个,如果没有返回None
findall 找到所有符合条件的内容,存储到列表中
sub (正则,替换内容,字符串)在字符串中按照正则替换匹配到的内容,替换的内容可以传入一个函数
split(正则,字符串)将字符串按照正则规则进行切割,将切割的内容存储在列表中
import re
print(re.search('\d+','python666hello235'))
print(re.match('\d+','python666hello'))

========================
贪婪模式   尽可能多的去匹配
非婪模式 尽可能少的去匹配
import re

str1 = 'my phone number is 138-88888888'

# result = re.match('.*(\d+-\d+)',str1)
#
# print(result.group(1))

# 非贪婪模式
result = re.match('.*?(\d+-\d+)',str1)

print(result.group(1))


 
posted @ 2022-06-27 19:14  冬天不下雨  阅读(92)  评论(0编辑  收藏  举报