NLP_Python3——正则表达式

之前有转载过一篇专门讲解正则表达式的博客(https://blog.csdn.net/u013032852/article/details/81506431),里面详细的描述了正则表达式的组成,最少入门应该是够了,毕竟那种高大上的正则表达式不是随便看两篇帖子就能学会的,还是要靠自己的活学活用及日常积累(反正我日常用到比较少,毕竟我的工作内容老是换来换去的···一般都是用到的时候过来查一下╮(╯_╰)╭),建议只做NLP的童鞋好好研究学习一下正则表达式,正则用好了可以省很多事的~~这里就简单的讲述下在python3中怎么去使用正则表达式。

在Python中是通过re模块来运用正则表达式的,使用步骤一般如下:

  1. 根据需要组装正则表达式
  2. 将表单时的字符串赋给Pattern实例
  3. 使用Pattern实例处理文本来获取匹配内容
  4. 从匹配的内容中获取想要的信息进行后续其他操作
import re
#在正则表达式前面加r的目的是避免因为转义'\'导致的问题,如r'\d'等同于'\\d'
pattern = re.compile(r'[\d\w]*')    # 将正则表达式(匹配数字和字符)赋给Pattern实例
match = pattern.match('ak,i.uop3umok2345234sdfj')    #使用Pattern实例处理文本获取匹配内容
if match:
    print(match.groups())

**************
输出结果:ak

re.compile(pattern, flags=0):函数是Pattern类的工厂方法(不了解什么是工厂方法的可以自己去搜一下设计模式,当然知道与否对学会怎么使用这个函数是没有影响的),用于将字符串形式的正则表达式编译为Pattern对象;flags参数用于指定匹配模式,多个匹配模式可以用按位或运算符“|”连接,比如re.I|re.M,flags枚举值如下:

A = ASCII = sre_compile.SRE_FLAG_ASCII # assume ascii "locale",使预定义字符类\w\W\b\B\s\S取决于ascii定义的字符属性
I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case,忽略大小写
L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale,使预定义字符类\w\W\b\B\s\S取决于当前环境
U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode "locale",使预定义字符类\w\W\b\B\s\S取决于unicode定义的字符属性
M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline,多行模式,改变'^'和'$'的行为
S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline,改变'.'的行为
X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments,在此模式下正则表达式可以是多行、忽略空白字符、可以加入注释

pattern.match(str) or re.match(pattern,str,flags):从字符串起始位置开始匹配str中是否有符合pattern的字符串,如果起始位置没有匹配成功则返回None,其中re.match的pattern参数可以直接为正则表达式字符串,如果直接使用正则表达式字符串注意不要忘记转义(加r)哈;使用此方法后返回一个match实例,此实例有以下属性与方法:

string:匹配对象,就是原文本 

re:匹配时使用的Pattern

pos:文本中正则表达式开始搜索的起始索引

endpos:文本中正则表达式结束搜索的索引

lastindex:最后一个被捕获的group在文中的索引,若捕获失败则返回None

lastgroup:最后一个被捕获的group的别名,若捕获失败或此group没有别名则返回None

group([0,1,2```]):捕获1个或多个group,参数可以为别名也可以为编号,其中编号0或不传参代表所有匹配的group;指定多个参数时返回元组结果

groups([args]):以元组形式返回截获的所有分组,相当于调用group(1,2```n)。args表示没有捕获group时返回args,默认为None

groupdict([agrs]) :返回以一个用别名为key,group为值的字典,没有别名的group不在其中,args表示没有捕获group时返回args,默认为None

start([group]):返回指定group在原文中的起始索引(group第一个字符的索引),group默认值为0

end([group]):返回指定的group在原文中的结束索引(group最后一个字符的索引+1),group默认值为0

span([group]):返回(start(group),end(group))

expand(template):将匹配到的分组代入template中然后返回。template中可以使用\id或\g<id>、 \g<name>引用分组,但不能使用编号0。\id与\g<id>是等价的;但\10将被认为是第10个分组,如果你想表达 \1之后是字符'0',只能使用\g<1>0

import re

m = re.match(r'(\w*)[, ;](\w*)', 'asdf,fda3e opwerl;o9weoir')

print('m.string', m.string)
print('m.re', m.re)
print('m.pos', m.pos)
print('m.endpos', m.endpos)
print('m.lastindex', m.lastindex)
print('m.lastgroup', m.lastgroup)
print('m.group(1,2)', m.group(1, 2))
print('m.groups()', m.groups())
print('m.start(2)', m.start(2))
print('m.end(2)', m.end(2))
print('m.span(2)', m.span(2))
print("m.expand(r'\2 \1')", m.expand(r'\2 \1'))

************************************************
输出结果:
m.string asdf,fda3e opwerl;o9weoir
m.re re.compile('(\\w*)[, ;](\\w*)')
m.pos 0
m.endpos 25
m.lastindex 2
m.lastgroup None
m.group(1,2) ('asdf', 'fda3e')
m.groups() ('asdf', 'fda3e')
m.start(2) 5
m.end(2) 10
m.span(2) (5, 10)
m.expand(r'\2 \1') fda3e asdf

pattern.search(str,pos,endpos) or re.search(pattern,string,flags): 从原文的pos下标开始到endpos下标结束尝试匹配group,pos和endpos参数默认为原文起始及结束位置。与match的区别在于search可以从文中进行匹配,而match只能从起始位置开始匹配

pattern.split(string,maxsplit) or re.split(pattern,string,maxsplit):将能够匹配到的group做为分隔符将原文分割后以列表返回,maxsplit指定最大分割次数,默认为全部分割

import re

pattern = re.compile(r'\W+')
strs = pattern.split('aki.uop3umok2,345234s/dfj')    #使用Pattern实例处理文本获取匹配内容
print(strs)

****************************
输出结果:
['aki', 'uop3umok2', '345234s', 'dfj']

pattern.findall(string,pos,endpos) or re.findall(pattern,string,flags):从原文中搜索匹配,将所有能匹配的group以列表形式返回

import re

pattern = re.compile(r'\w+')
strs = pattern.findall('aki.uop3umok2,345234s/dfj')
print(strs)

*****************************
输出结果:
['aki', 'uop3umok2', '345234s', 'dfj']

pattern.sub( repl, string, count=0) or sub(pattern, repl, string, count=0, flags=0):使用repl替换string中匹配的group并返回替换后的字符串,其中repl可以为字符串,也可以为方法;当repl是一个字符串时,可以使用\id或\g<id>、 \g<name>引用分组,但不能使用编号0;当repl是一个方法是,这个方法应该只接受一个参数(match对象),并返回一个字符串用于替换;count用于指定最多替换次数,默认为全部替换

import re

def sub_match(m):
    return m.group(1) + ":" + m.group(2)
pattern = re.compile(r'(\d+).(\d+)')
strs = pattern.sub('NUM', 'aki.uop3umok2,345234s/dfj')
print(strs)
strs = pattern.sub(r'\1:\2', 'aki.uop3umok2,345234s/dfj')
print(strs)
strs = pattern.sub(sub_match, 'aki.uop3umok2,345234s/dfj')
print(strs)

********************************
输出结果为:
aki.uop3umokNUMs/dfj
aki.uop3umok2:345234s/dfj
aki.uop3umok2:345234s/dfj

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值