前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于python正则表达式

关于python正则表达式

作者头像
python与大数据分析
发布2022-03-11 13:58:53
3240
发布2022-03-11 13:58:53
举报
文章被收录于专栏:python与大数据分析

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

re 模块使 Python 语言拥有全部的正则表达式功能。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

代码语言:javascript
复制
import re
#普通字符串分割
line = '王 宝; 强, 是,一个, 好人'
s=line.split(';')
print(s)
#['王 宝', ' 强, 是,一个, 好人']
#函数 re.split() 分割,它允许为分隔符指定多个正则模式。
#在上面的例子中,分隔符可以是逗号,分号或者是空格,并且后面紧跟着任意个的空格
s=re.split(r'[;,\s]\s*', line)
print(s)
#['王', '宝', '强', '是', '一个', '好人']
#加竖线的split分割,阅读会容易一些
s=re.split(r'[;|,|\s]\s*', line)
print(s)
#['王', '宝', '强', '是', '一个', '好人']
#re.split捕获分组,使用()方式
#如果使用捕获分组,那么被匹配的文本也将出现在结果列表中
s=re.split(r'(;|,|\s)\s*', line)
print(s)
#['王', ' ', '宝', ';', '强', ',', '是', ',', '一个', ',', '好人']
#不加竖线的捕获分组,无法解析字符串,所以建议统一使用|分割
s=re.split(r'(;,\s)\s*', line)
print(s)
#['王 宝; 强, 是,一个, 好人']

filenames=[ 'Makefile', 'foo.c', 'bar.py', 'spam.c', 'spam.h' ,'foo.h']
#用 str.startswith()检查字符串开头
filename= [name for name in filenames if name.startswith('foo') ]
print(filename)
#['foo.c', 'foo.h']
#用 str.endswith()检查字符串结尾
filename= [name for name in filenames if name.endswith(('.c')) ]
print(filename)
#['foo.c', 'spam.c']
#用 str.endswith()检查多个字符串结尾,必须用元祖参数
filename= [name for name in filenames if name.endswith(('.c', '.h')) ]
print(filename)
#['foo.c', 'spam.c', 'spam.h', 'foo.h']

url = 'http://www.python.org'
s=re.match('http:|https:|ftp:',url)
print(s)
#<re.Match object; span=(0, 5), match='http:'>

from fnmatch import fnmatch, fnmatchcase
#通过fnmatch, fnmatchcase匹配字符串
filenames = ['dat1.csv', 'Dat2.csv', 'DAT33.csv', 'config.ini', 'foo.py']
##fnmatch对大小写不敏感
filename=[name for name in filenames if fnmatch(name, 'Dat*.csv')]
print(filename)
#['dat1.csv', 'Dat2.csv', 'DAT33.csv']
filename=[name for name in filenames if fnmatch(name, 'Dat[0-9]*.csv')]
print(filename)
#['dat1.csv', 'Dat2.csv', 'DAT33.csv']
#fnmatchcase对大小写敏感
filename=[name for name in filenames if fnmatchcase(name, 'Dat*.csv')]
print(filename)
#['Dat2.csv']

dt1 = '11/27/2012'
dt2 = 'Nov 27,2012'
if re.match(r'\d+/\d+/\d+',dt1):
    print('yes')
else:
    print('no')
#模式编译
#如果用同一个模式去做多次匹配,应先将模式字符串预编译为模式对象
dtrep=re.compile(r'\d+/\d+/\d+')
if dtrep.match(dt1):
    print('yes')
else:
    print('no')
text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
s=dtrep.findall(text)
print(s)
#['11/27/2012', '3/13/2013']

dtrep = re.compile(r'(\d+)/(\d+)/(\d+)')
m = dtrep.match('11/27/2012')
print(m.groups())      #('11', '27', '2012')
print(m.group(0))      #11/27/2012
print(m.group(1))      #11
print(m.group(2))      #27
print(m.group(3))      #2012
month, day, year = m.groups()
for month, day, year in dtrep.findall(text):
    print('{}-{}-{}'.format(year,month,day))    #2012-11-27 2013-3-13
#以迭代方式返回匹配
for m in dtrep.finditer(text):
    print(m)    #<re.Match object; span=(9, 19), match='11/27/2012'>    <re.Match object; span=(34, 43), match='3/13/2013'>
    print(m.groups())   #('11', '27', '2012')   ('3', '13', '2013')
dtrep = re.compile(r'(\d+/\d+/\d+)')
for date in dtrep.findall(text):
    print(date)    #2012-11-27 2013-3-13

text = 'yeah, but no, but yeah, but no, but yeah'
text.replace('yeah','yep')
print(text)
#yeah, but no, but yeah, but no, but yeah
text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
newtext=re.sub(r'(\d+)/(\d+)/(\d+)',r'\3-\1-\2',text)
print(newtext)
#Today is 2012-11-27. PyCon starts 2013-3-13.

strre = re.compile(r'\"(.*)\"')
text1 = 'Computer says "no."'
print(strre.findall(text1))
#['no.']
text2 = 'Computer says "no." Phone says "yes."'
print(strre.findall(text2))
#['no." Phone says "yes.']
#加?变成非贪婪模式,从而得到最短的匹配
strre = re.compile(r'\"(.*?)\"')
print(strre.findall(text2))
#['no.', 'yes.']

comment = re.compile(r'/\*(.*?)\*/')
text1 = '/* this is a comment */'
text2 = '''/* this is a
 multiline comment */
... '''
print(comment.findall(text1))   #[' this is a comment ']
print(comment.findall(text2))   #[]
#(?:.|\n) 指定了一个非捕获组
comment = re.compile(r'/\*((?:.|\n)*?)\*/')
print(comment.findall(text2))
#[' this is a\n multiline comment ']
#正则表达式中的点 (.) 匹配包括换行符在内的任意字符串
comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)
print(comment.findall(text2))
#[' this is a\n multiline comment ']
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档