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 正则式学习笔记

    原文作者:_____miss
    原文地址: https://blog.csdn.net/u011412768/article/details/109563089
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞