Python正则匹配的应用——替换括号及括号内字符、文本分句

本文是在实际处理文本时遇到的两个应用。

1、剔除括号及括号内的数据

     用正则匹配的方法,替换掉目标字符串为空,具体示例如下:

s = "我是一个人(中国人)aaa[真的]bbbb{确定}"
a = re.sub(r"\(.*?\)|\{.*?\}|\[.*?\]", "", s)
print(a)

output:
我是一个人aaabbbb

 解释:正则匹配的规则也是从左往右开始匹配的。因为括号()在正则匹配中有特殊用法,所以这里用\(和\)的方式匹配正反括号。“.”表示匹配任意初换行之外的字符,“*”表示匹配其前面的字符0次或无数字,那这样的话,"\(.*"这个表示匹配的字符串以正括号开始,后面0个或者任意个数的非换行字符。 

关于“?”的使用:

(1)如果是跟在一般符号后面,则表示匹配表达式0次或1次。比如“do(es)?”,这里就是表示匹配一定以do开头,但是es出现0次或者1次。所以“do(es)?”可以匹配的字符串包括“does”和“do”。在正则匹配中,(pattern)表示匹配pattern 并获取这一匹配,要匹配圆括号字符,则使用 '\(' 或 '\)'。

(2)如果是跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。关于贪婪和非贪婪匹配可以看底下的例子。

2、贪婪匹配和非贪婪匹配

      对于贪婪和非贪婪的的影响,在实践中,觉得最大的影响就是对括号的匹配。

s = "我是一个人(中国人)哈哈哈哈哈(真的)bbbb{确定}"
# 非贪婪模式
print(re.findall(r"\(.*?\)", s))
# 贪婪模式
print(re.findall(r"\(.*\)", s))

输出结果:
['(中国人)', '(真的)']
['(中国人)哈哈哈哈哈(真的)']

2、只替换括号内的内容

s = "我是一个人(中国人)aaa[真的]bbbb{确定}"
b = re.sub(r"(?<=\().+?(?=\))|(?<=\[).+?(?=\])", "hahah", s)
print(b)

output:
我是一个人(hahah)aaa[hahah]bbbb{确定}

3、文本分句

      待更新

 

参考文章:

正则表达式(括号)、[中括号]、{大括号}的区别小结

Python 正则式学习笔记

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值