用正则匹配的方法,替换掉目标字符串为空,具体示例如下:
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 正则式学习笔记
本文是在实际处理文本时遇到的两个应用。1、剔除括号及括号内的数据 用正则匹配的方法,替换掉目标字符串为空,具体示例如下:s = "我是一个人(中国人)aaa[真的]bbbb{确定}"a = re.sub(r"\((.*?)\)|\{(.*?)\}|\[(.*?)\]", "", s)print(a)output:我是一个人aaabbbb 加上剔除文本中的各种标点符号,例子如下:s = "我是一个人(中国人)aaa[真的]bbbb{确定}''""?::”“"a =...
项目上碰到一个需求,是取多个递增文件的文件名,类似于test(1).txt、test(2).txt,但是不需要
括号
,只要test1、test2这种格式,最开始想到的办法就是js里的replace
替换
,先上一个比较笨但是也能实现效果的例子
let name = "test(1).txt"
let data = name.split('.')[0].replace('(', '').replace(')', '')
console.log(data) // test1
首先是将name用split()方法分割
在
Python
中
实现
正则
的方式是通过re(regular expression的缩写)模块来实现的,你可以调用re模块的各种方法来实现不同的功能,下面我们就来说下,在
Python
中
通过re模块可以调用那些方法,以及这些方法的作用都是什么;还有就是
正则
的实例以及各种特殊符号的含义:
1、re.sub和replace:
sub的全拼是substitute,也就是
替换
的意思;既然知道是
替换
了,那就很容易用到实例
中
了,其实replace也是
替换
的意思,只不过它们的用法不太相同,下面用一个例子来详细说明下它们的异同之处:
>>> import re
>>> str1 = 'Hello
string1 = '海堤(段)终点坐标(东经)(度)'
string2 = "分(泄)洪闸(节制闸、排退水闸、引进水闸、挡潮闸)设计过闸流量"
string3 = '就医地点分类(本统筹地区、(地级)市内跨统筹地区、省内跨统筹地区、省外就医)'
1.
正则匹配
串前加了r就是为了使得里面的特殊符号不用写反斜杠了。
2.[ ]具有去特殊符号的作用,也就是说[(]里的(只是平凡的
括号
3.
正则匹配
串里的()是为了提取整个
正则
串
中
符合
括号
里
一、 什么是组
关于组匹配模式,
Python
官网上说得比较简单,也没有这个名词,只有组这个名词,老猿查了比较多的资料和做了相关测试之后才理解。
组匹配模式,就是在匹配的
正则表达式
中
使用小
括号
“()”括起来的任意一个合法的匹配模式串,左
括号
标记组的起点,右
括号
标记组的终点,即组匹配模式定义为:
(组匹配模式串)
其
中
组匹配模式串是整个
正则表达式
的一个子匹配模式。在一个
正则表达式
内可以定义多个组,每个...
最近在做处理
文本
的相关工作,需要对已有
文本
进行修改,如增加
内容
,删除
内容
,
替换
内容
等。所以对re.sub的使用比较频繁。
为什么要使用
正则
替换
,因为在编码过程
中
,读取文件
内容
进
字符串
后,如果是对数组进行操作,当需要将查找到的
内容
替换
时,如果
替换
内容
长度大于查找
内容
长度,将会修改原有
文本
中
需要保留的
内容
。等等还有很多这种需要考虑空出位置的问题。所以使用re.sub来进行操作。
首先构建一个
正则表达式
...
import re
bracket = re.compile(r'\([^()]+\)') # 寻找最内层
括号
规则
mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 寻找乘法运算规则
div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(
def split_into_sentences(text):
tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
return tokenizer.tokenize(text)
text = "这是一段
文本
。它包含了几个句子。"
sentences = split_into_sentences(text)
print(sentences) # 输出: ['这是一段
文本
。', '它包含了几个句子。']
这段代码使用了 `nltk` 库
中
的 `punkt` 分词器来对
文本
进行
分句
。它首先加载了英文的
分句
器,然后使用 `tokenize` 方法将
文本
分割为句子列表。
你可以使用这段代码来对
中
文
文本
进行
分句
,只需要将 `english.pickle`
替换
为适用于
中
文的
分句
器文件即可。例如,你可以使用 `chinese.pickle` 作为
分句
器文件,但是需要注意的是,你需要确保 `nltk` 库
中
包含了适用于
中
文的
分句
器文件。