正则一

20191225日(正则表达式)

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'>

posted @ 2019-12-26 11:19  进阶的淑琴  阅读(112)  评论(0)    收藏  举报