Python笔记(十一):正则表达式

用来匹配字符串(动态、模糊的匹配)
如查找某个人,姓陈,两个字;即后面那个字是模糊的;


常用函数

’ . ‘(一点):匹配任意一个字符;
’ ^ ‘:匹配字符开头(\A )
$ :匹配字符结尾 (\Z )

re.match():从头开始匹配。

import re

#在后面的字符串中查找前面的格式内容
res = re.match("^Bull","RedBull321")    
res.group()                     #可以查看匹配到了什么

res = re.match("^Bull\d","RedBull321") 
res.group()
>> 'Bull3'                     #匹配一个数字

res = re.match("^Bull\d+","RedBull321") 
res.group()
>> 'Bull321'                   #匹配多个数字

re.search():

# 取Bull    如果有多个,只取第一个
re.search("B[a-z]+l","RedBull321")
>>  <_sre.SRE_Match object; span=(3, 7), match='Bull'>



# 中间有大写
re.search("B[a-zA-Z]+l","RedBuAll321RedBull")
>> <_sre.SRE_Match object; span=(3, 8), match='BuAll'>


# 匹配#之间的字符
re.search("#.+#","RedBuAll321#RedBull#hello")

re.findall(): 找到所有的匹配


re.split(): 分割

# 按数字进行分割(1个数字)
re.split("[0-9]","abc12de3f45gh")
['abc', '', 'de', 'f', '', 'gh']     #因为是1个数字,所以中间有空格

# 按数字进行分割(不限多少个)
re.split("[0-9]+","abc12de3f45gh")
['abc', 'de', 'f', 'gh']

re.sub(): 替换

# 前面是匹配的项,后面是替换的项
re.sub("[0-9]+","|","abc12de3f45GH")
'abc|de|f|GH'




常用符号

  • ? : 匹配前一个字符1次或0次;(问号前的字符可以有,可以没有)
# 匹配前一个字符(问号前的一个字符可以匹配1次,也可以匹配0次)
       #即前两个aa必须要有,挨着?的a可以没有
re.search("aaa?","aaEvanaaaaa")

<_sre.SRE_Match object; span=(0, 2), match='aa'>
  • {m} : m为数值,说明匹配多少次
  • {n,m}: 匹配n-m次
# [0-9]{3}即0-9范围内的数字匹配3次
re.search("[0-9]{3}","aa1x2a345aa")
<_sre.SRE_Match object; span=(6, 9), match='345'>


# 不固定匹配多少次(如匹配1-3次)
re.search("[0-9]{1,3}","aa1x2a345aa")
<_sre.SRE_Match object; span=(2, 3), match='1'>

# 如果要把其中的数字都匹配出来
re.findall("[0-9]{1,3}","aa1x2a345aa")
['1', '2', '345']
  • |: 匹配左或右的字符
# 匹配abc或ABC(从左往右先匹配到的ABC)
re.search("abc|ABC","ABCBabcCD").group()
'ABC'

# findall可以把两个都匹配到,没有group()方法
re.findall("abc|ABC","ABCBabcCD")
['ABC', 'abc']
  • (…): 分组匹配
# abc匹配两次
re.search("(abc){2}","Evanabcabc").group()
'abcabc'
  • \: 转义,意思是不要将后面带的符号作为语法
# 如要匹配管道符
re.search("(abc){2}\|","Evanabcabc|").group()
'abcabc|'
  • \d: 匹配数字
  • \D: 匹配非数字(所有非数字的字符)
# 匹配非数字的所有字符
re.search("\D+","123ba\r\d").group()
'ba\r\\d'
  • \w: 匹配[A-Za-z0-9] (大小写字母+数字)
  • \W: 匹配非[A-Za-z0-9]
# 匹配除了字母和数字以外的字符
re.search("\W+","123ba\r\d").group()
'\r\\'
  • \s: 匹配\r \n \t等
# \r \n \t
re.search("\s+","1ddDF23$- \r\n    ")
<_sre.SRE_Match object; span=(9, 16), match=' \r\n    '>
  • 分组匹配:可以直接取为字典形式
re.search("(?P<id>[0-9]+)","abcd1234dada@233").group()
'1234'

re.search("(?P<id>[0-9]+)","abcd1234dada@233").groupdict()
{'id': '1234'}

# 再多匹配一组
re.search("(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)","abcd1234dada@233").groupdict()
{'id': '1234', 'name': 'dada'}

例如,利用分组匹配,剥离身份证号信息:

re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{8})","410303199502116789").groupdict()

{'birthday': '19950211', 'city': '03', 'province': '4103'}
  • flags=re.MULTILINE: 改变匹配的大小写形式
    • re.I (re.IGNORECASE) :忽略大小写(括号内为完整写法)
    • re.M (MULTILINE):多行模式,改变^和$的行为
    • re.S (DOTALL):点任意匹配,改变 . 的行为。
# 前面匹配小写字母,要把后面大写也匹配上
re.search("[a-z]+","abcdA",flags = re.I).group()
'abcdA'

猜你喜欢

转载自blog.csdn.net/weixin_42026630/article/details/80628443
今日推荐