本文是在实际处理文本时遇到的两个应用。
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、文本分句
待更新
参考文章: