正则一
2019年12月25日(正则表达式)
1. 正则表达式的定义
正则表达式:就一个字符串,可以进行模糊的匹配,
从另外一个字符串通过表达式,找到模糊匹配的结果。
1)判断某个内容在不在
2)找到想要的一些内容
1.1. Import re
regular expression
1.2. Match()
>>> re.match(r"abc","abcdef")
<_sre.SRE_Match object; span=(0, 3), match='abc'>
match:从开头匹配正则表达式,如果匹配到,获取一个匹配对象
       如果匹配不到就获取一个None
       第一个参数:正则表达式
       第二个参数:要匹配的目标字符串
re.match(r"abc","abcdef")
>>> print(re.match(r"abc","1abcdef"))
None
1.3. \W+ , +,\w+
>>> re.match(r"\w+","abc def")
<_sre.SRE_Match object; span=(0, 3), match='abc'>
>>> re.match(r"\w+","abc def")
<_sre.SRE_Match object; span=(0, 3), match='abc'>
\w:匹配一个字母或者一个数字,_
+:表示匹配一个或多个
\w+:表示匹配多个字母或者数字和_的组合。
1.3.1. \w+
>>> re.match(r"\w+","a1_bc def")
<_sre.SRE_Match object; span=(0, 5), match='a1_bc'>
1.4. 查看内容
match_object = re.match(r"\w+","a1_bc def")
#查看内容:
>>> match_object.group()
'a1_bc'
#查看取值范围
>>> match_object.span()
(0, 5)
>>>
1.5. 查看取值范围
match_object = re.match(r"\w+","a1_bc def")
print(match_object.group())  #获取匹配到的内容
print(match_object.span()) #获取匹配的索引范围
1.6. 正则表达式的贪婪性
>>> re.match(r"\w","a1_bc def")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match(r"\w+","a1_bc def")
<_sre.SRE_Match object; span=(0, 5), match='a1_bc'>
>>> re.match(r"\w+?","a1_bc def")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match(r"\W+","()#$%@ def")
<_sre.SRE_Match object; span=(0, 7), match='()#$%@ '>
\w:匹配一个字母或者一个数字,_
\W:匹配非字母、非数字、非_的情况
\d:匹配数字
\D:匹配非数字
1.7. \d + ,\D+
>>> re.match(r"\d+","123abc 455").group()
'123'
>>> re.match(r"\D+","123abc 455").group()
re.match(r"\D+","123abc 455")
>>> re.match(r"\D+","efg123abc 455")
<_sre.SRE_Match object; span=(0, 3), match='efg'>
>>> re.match(r"\D+","efg123abc 455").group()
2. \s,\S
\s:表示匹配一个空白字符," "\t\n\r
\S:表示匹配非空白字符
>>> re.match(r"\s+"," \r\n\t123")
<_sre.SRE_Match object; span=(0, 4), match=' \r\n\t'>
>>> re.match(r"\S+","!s#e ")
<_sre.SRE_Match object; span=(0, 4), match='!s#e'>
取范围:
>>> re.match(r"[0-5]","5")
<_sre.SRE_Match object; span=(0, 1), match='5'>
>>> re.match(r"[0-5]","6")
>>> re.match(r"[0-9a-zA-Z]","6")
<_sre.SRE_Match object; span=(0, 1), match='6'>
3. 小练习:#从开头匹配一个空格一个数字和一个字母
re.match(r" \d[a-zA-Z]"," 1A")
执行结果:
>>> re.match(r" \d[a-zA-Z]"," 1A")
<_sre.SRE_Match object; span=(0, 3), match=' 1A'>
3.1. ?与 *
量词:
?:匹配1个或0个字符
*:匹配0个或多个字符
{m,n}:
>>> re.match(r"a?","ab")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match(r"a?","b")
<_sre.SRE_Match object; span=(0, 0), match=''>
>>> re.match(r"a?","aab")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match(r"a?","bab").group()
''
>>> re.match(r"[0-5]","5")
<_sre.SRE_Match object; span=(0, 1), match='5'>
>>> re.match(r"[0-5]","6")
>>> re.match(r"[0-9a-zA-Z]","6")
<_sre.SRE_Match object; span=(0, 1), match='6'>
re.match(r"\d[a-z]","6y")
re.match(r"\d[a-zA-Z]","6y")
>>> re.match(r"\s","\r")
<_sre.SRE_Match object; span=(0, 1), match='\r'>
>>> re.match(r"\s","\n")
<_sre.SRE_Match object; span=(0, 1), match='\n'>
>>> re.match(r"\s"," ")
<_sre.SRE_Match object; span=(0, 1), match=' '>
3.1.1. 怎么确定你取的值是你想要的,一步步确认
>>> re.match(r" \d\w[a-z]"," 1zx")
<_sre.SRE_Match object; span=(0, 4), match=' 1zx'>
>>> re.match(r" "," 1zx")
<_sre.SRE_Match object; span=(0, 1), match=' '>
>>> re.match(r" \d"," 1zx")
<_sre.SRE_Match object; span=(0, 2), match=' 1'>
>>> re.match(r" \d\w"," 1zx")
<_sre.SRE_Match object; span=(0, 3), match=' 1z'>
>>> re.match(r" \d\w[a-z]"," 1zx")
<_sre.SRE_Match object; span=(0, 4), match=' 1zx'>
3.1.2. ?量词
匹配一个字符0次或1次,?用在数量词(*/+/{m}/{m,n})后面才表示抑制贪婪性
>>> re.match(r"a?","ab")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match(r"a?","b")
<_sre.SRE_Match object; span=(0, 0), match=''>
>>> re.match(r"a?","aab")
<_sre.SRE_Match object; span=(0, 1), match='a'>
>>> re.match(r"a?","bab").group()
''
>>> re.match(r"a?b","bab").group()
'b'
>>> re.match(r"a?b","abab").group()
'ab'
3.1.3. *(匹配0个或者多个)
匹配一个字符0次或多次,注意正则默认的贪婪性,贪婪性指的是在满足匹配的条件下再继续贪婪更多的匹配
>>> re.match(r"a*b","aaaaaaabbbb")
<_sre.SRE_Match object; span=(0, 8), match='aaaaaaab'>
>>> re.match(r"a*b","aaaabab").group()
'aaaab'
>>> re.match(r"a?b","abab").group()
'ab'
3.2. {}
匹配次数
{m}:匹配前一个字符m次
{m,n}:匹配前一个字符m到n次
{m,}匹配前一个字符至少m次
{,n}匹配前一个字符0到n次,最多n次
>>> re.match(r"a{1}b","ab")
<_sre.SRE_Match object; span=(0, 2), match='ab'>
>>> re.match(r"a{1,3}b","ab")
<_sre.SRE_Match object; span=(0, 2), match='ab'>
>>> re.match(r"a{1,3}b","aab")
<_sre.SRE_Match object; span=(0, 3), match='aab'>
>>> re.match(r"a{1,3}b","aaab")
<_sre.SRE_Match object; span=(0, 4), match='aaab'>
>>> re.match(r"a{1,3}b","aaaab")
>>> re.match(r"a{1,}b","aaaab")
<_sre.SRE_Match object; span=(0, 5), match='aaaab'>
>>> re.match(r"a{,2}b","aaaab")
>>> re.match(r"a{,2}b","aab")
<_sre.SRE_Match object; span=(0, 3), match='aab'>
正则贪婪性,按照最多 的匹配
>>> s="bbbaaa"
>>> if re.match(r"b{3}",s):
... print("找到了")
... else:
... print("没找到")
...
找到了
>>> s="bbaaa"
>>> if re.match(r"b{3}",s):
... print("找到了!")
... else:
... print("没找到")
...
没找到
>>>
4. Findall()与search()的区别
Match:必须从第一个字符开始,就要满足这个要求
Search:不需要开始匹配,只要找到就可以
>>> s="bbbbaaa"
>>> if re.search(r"ba",s):
... print("找到了!")
... else:
... print("没找到")
...
找到了!
4.1. Search:从任意位置找到字符串
>>> re.search(r"\d{5}","abc12345ce")
<_sre.SRE_Match object; span=(3, 8), match='12345'>
>>>
>>> re.search(r"\d{5}","abc12345ce12345cd33333ddd")
<_sre.SRE_Match object; span=(3, 8), match='12345'>
>>>
4.2. Findall()找到所有匹配表达 式的
>>> re.findall(r"\d{5}","abc12345ce12345cd33333ddd")
['12345', '12345', '33333']
4.3. #统计一句话中有多少个单词
>>> s="I am a boy!sure!!!"
>>> re.findall(r"\w+",s)
['I', 'am', 'a', 'boy', 'sure']
>>> len(re.findall(r"\w+",s))
5
>>>
5. Split()切割
>>> re.split(r"\d+","ab12cde123efg456x")
['ab', 'cde', 'efg', 'x']
>>> re.split(r"\d+","ab12cde123efg456x")
['ab', 'cde', 'efg', 'x']
>>>
6. 正则表达式的修饰符
6.1. Re.sub(替换sub)
>>> re.sub(r"\d+","a","123xx456yy")
'axxayy'
6.2. Re.i(忽略大小写匹配)
#默认情况下,要匹配小写字母,但是字符串以大写西门开头,匹配失败
>>> re.search(r"ab","12aBxt",re.I)
<_sre.SRE_Match object; span=(2, 4), match='aB'>
>>> p=re.compile('[a-z]+',re.I)
>>> m=p.match('AAbDsd123ab')
>>> if m:
... print (m.group())
... else:
... print ("no string found!" )
...
AAbDsd
>>>
6.3. 掐头去尾
>>> re.search(r"^abc$","abc")
<_sre.SRE_Match object; span=(0, 3), match='abc'>
>>> re.search(r"^abc$","1abc")
>>> re.search(r"^abc$","abcz")
>>> re.search(r"^abc","abczxxx")
<_sre.SRE_Match object; span=(0, 3), match='abc'>
>>> re.search(r"abc$","abczxxx")
>>> re.search(r"abc$","abczxxxabc")
<_sre.SRE_Match object; span=(7, 10), match='abc'>
6.4. re.M(多行匹配,影响 ^ 和 $的行为)
多行匹配,影响 ^ 和 $的行为
#默认情况下,未使用re.M,会匹配多行文字的最后一行的结尾
>>> re.findall(r"^a\d","a1\na2\na3\n")
['a1']
>>> re.findall(r"^a\d","a1\na2\na3\n",re.M)
['a1', 'a2', 'a3']
>>> import re
>>> p=re.compile('[a-z]+$')
>>> string="""I am a boy
... you r a beautiful girl
... right"""
>>> m=p.findall(string)
>>> if m:
... print(m)
... else:
... print("bo string found!")
...
['right']
7. .表示除回车外的任意一个字符都可以匹配到
>>> re.match(r".a","xa")
<_sre.SRE_Match object; span=(0, 2), match='xa'>
>>> re.match(r".a","\na")
>>> re.match(r".a"," a")
<_sre.SRE_Match object; span=(0, 2), match=' a'>
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号