当前位置:   article > 正文

【python学习】用正则表达式匹配查找文本_python正则匹配文本

python正则匹配文本

学习自书本《Python编程快速上手——让繁琐工作自动化》

正则表达式

#正则表达式
import re
aRegex=re.compile('\d\d\d-\d\d\d-\d\d\d\d')
mo=aRegex.search('我的电话号码是:123-456-7890')
print('找到句子中的匹配内容为:',mo.group())
  • 1
  • 2
  • 3
  • 4
  • 5

输出结果:

找到句子中的匹配内容为: 123-456-7890
  • 1

利用括号分组

#利用括号分组
import re
aRegex=re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo=aRegex.search('我的电话号码是:123-456-7890')
print('mo.group()',mo.group())
print('mo.group(0)',mo.group(0))
print('mo.group(1)',mo.group(1))
print('mo.group(2)',mo.group(2))
print('mo.groups()',mo.groups())
areaCode,mainNumber=mo.groups()
print('areaCode是{},mainNumber是{}'.format(areaCode,mainNumber))
#如果需要在文本中匹配括号,需要用倒斜杠对左右括号进行字符转义
aRegex2=re.compile(r'(\(\d\d\d\))(\d\d\d-\d\d\d\d)')
mo2=aRegex2.search('我的电话号码是:(123)456-7890')
print('mo2.group(1)',mo2.group(1))
print('mo2.group(2)',mo2.group(2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出结果:

mo.group() 123-456-7890
mo.group(0) 123-456-7890
mo.group(1) 123
mo.group(2) 456-7890
mo.groups() ('123', '456-7890')
areaCode是123,mainNumber是456-7890
mo2.group(1) (123)
mo2.group(2) 456-7890
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

用管道匹配多个分组

#用管道匹配多个分组
import re
bRegex=re.compile(r'zhangsan|li si')
mo1=bRegex.search('zhangsan and li si')
#第一次出现的匹配对象将被返回
print('mo1.group()',mo1.group())
cRegex=re.compile(r'zhang(san|si|wu)')
mo2=cRegex.search('zhangsan and zhangsi')
print('mo2.group()',mo2.group())
print('mo2.group(1)',mo2.group(1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出结果:

mo1.group() zhangsan
mo2.group() zhangsan
mo2.group(1) san
  • 1
  • 2
  • 3

用问号实现可选匹配

#用问号实现可选匹配
import re
#(xiao)?可选分组,出现零次或一次
dRegex=re.compile(r'li(xiao)?si')
mo1=dRegex.search('有个人叫lisi')
print('mo1.group()',mo1.group())
mo2=dRegex.search('他儿子叫lixiaosi。')
print('mo2.group()',mo2.group())
#尝试用来匹配不管包不包含区号
eRegex=re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d')
mo3=eRegex.search('电话号码是:123-456-7890')
print('mo3.group()',mo3.group())
mo4=eRegex.search('电话号码是:456-7890')
print('mo4.group()',mo4.group())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出结果:

mo1.group() lisi
mo2.group() lixiaosi
mo3.group() 123-456-7890
mo4.group() 456-7890
  • 1
  • 2
  • 3
  • 4

用星号匹配零次或多次

#用星号匹配零次或多次
import re
fRegex=re.compile(r'li(xiao)*si')
mo1=fRegex.search('有个人叫lisi')
print('mo1.group()',mo1.group())
mo2=fRegex.search('他儿子叫lixiaosi。')
print('mo2.group()',mo2.group())
mo3=fRegex.search('他孙子叫lixiaoxiaosi。')
print('mo3.group()',mo3.group())
mo4=fRegex.search('他曾孙叫lixiaoxiaoxiaosi。')
print('mo4.group()',mo4.group())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出结果:

mo1.group() lisi
mo2.group() lixiaosi
mo3.group() lixiaoxiaosi
mo4.group() lixiaoxiaoxiaosi
  • 1
  • 2
  • 3
  • 4

用加号匹配一次或多次

#用加号匹配一次或多次
import re
gRegex=re.compile(r'li(xiao)+si')
mo1=gRegex.search('有个人叫lisi')
#print('mo1.group()',mo1.group())
if mo1==None:
    print('这个人不存在')
mo2=gRegex.search('他儿子叫lixiaosi。')
print('mo2.group()',mo2.group())
mo3=gRegex.search('他孙子叫lixiaoxiaosi。')
print('mo3.group()',mo3.group())
mo4=gRegex.search('他曾孙叫lixiaoxiaoxiaosi。')
print('mo4.group()',mo4.group())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果:

这个人不存在
mo2.group() lixiaosi
mo3.group() lixiaoxiaosi
mo4.group() lixiaoxiaoxiaosi
  • 1
  • 2
  • 3
  • 4

用花括号匹配特定次数

#用花括号匹配特定次数
import re
hRegex=re.compile(r'(ha){3}')
mo1=hRegex.search('hahahalalala')
print('mo1.group()',mo1.group())
mo2=hRegex.search('ha')
if mo2==None:
    print('(ha){3}只能匹配到hahaha')
iRegex=re.compile(r'(ha){3,5}')
mo3=iRegex.search('hahalalalahahahahaha')
print('mo3.group()',mo3.group())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出结果:

mo1.group() hahaha
(ha){3}只能匹配到hahaha
mo3.group() hahahahaha
  • 1
  • 2
  • 3

用findall()获取所有匹配结果

#用findall()获取所有匹配结果
import re
jRegex=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
result1=jRegex.findall('张三电话123-456-7890,李四电话234-567-8901')
print(result1)
kRegex=re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)')
result2=jRegex.findall('张三电话123-456-7890,李四电话234-567-8901')
print(result2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出结果:

['123-456-7890', '234-567-8901']
['123-456-7890', '234-567-8901']
  • 1
  • 2

#书上说如果在正则表达式中有分组,findall会返回元组的列表,但我运行后没有,不知道为什么。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/113560
推荐阅读
相关标签
  

闽ICP备14008679号