文章目录
0.什么是正则表达式?
import re
即可使用
一定要注意,正则的书写,每个符号都要为之慎重
提示:以下是本篇文章正文内容,下面案例可供参考
1.常用的正则符号
1.1常用的符号
慢慢遇见,慢慢添加~
#1
. 匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]
\d 所有数字
\D 所有非数字
\s 匹配所有空白符
\S 非空白符,不包括换行
\w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
[A-Z] [A-Z] 表示一个区间,匹配所有大写字母
[a-z] [a-z] 表示所有小写字母
[\u4e00-\u9fa5] 所有中文字符
[^\u4e00-\u9fa5] 所有非中文字符
1.2 定位符
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
line = re.sub(r'/[m|n]$','',line)
\b 匹配一个单词边界,即字与空格间的位置。
\B 非单词边界匹配。
1.3 限定符
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格
2.常用实例
2.1 以函数作为正则参数的使用
这里就是将re.sub(r’‘,’’,string)的第二个参数由字符串等形式更换为函数,替换的就更为灵活,只需要写出自己想要使用的函数即可,在调用该函数时,如下图示例调用即可
def get_Tail_1(line):
'''
啦啦{AA拉},保留‘拉’
'''
return str(line.group())[-2:-1]
……
line=re.sub(r'([\u4e00-\u9fa5]\{AA[\u4e00-\u9fa5]\})',get_Tail_1,line)
2.2 正则表达式的内容以关键词文件形式存在时的用法
有的时候,查询使用的正则表达式的内容,并不是一成不变或者是非默认的,而是以关键词的形式储存在指定文件内。当我们以这些关键词为匹配的内容进行查找时,就需要遍历这些关键词依次查询。也可以直接将这些关键词形成一个正则表达式,进行查找
-
目前并没有测试这种正则的长度可以最大到多少
def read_Dict(KeyF):
'''
读取关键词文件,返回关键词列表
---
KeyF:文件路径
return:列表,元素为关键词
'''
key_word=[]
with open(KeyF,'r') as f:
for line in f:
line=line.strip()
key_word.append(line)
return key_word
def process_file(key_word,File):
'''
读取文件,利用关键词,判断
---
key_word:关键词
File:待判断语料文件
'''
regex = ''
for key in key_word: #将关键词形成正则字符模式
regex += key + '|'
pattern=regex[:-1] #去除最后一个“|”
count = []
with open(File,'r') as f:# 读取待判断文件文本
for line in f:
line=line.strip()
keys = re.findall(pattern,line)
if keys:
count += keys
2.3 [ ] 和 | 的使用
>>> t='aabbccdd123'
>>> line1=re.findall('[abc]',t)
>>> line1
['a', 'a', 'b', 'b', 'c', 'c']
>>> line1=re.findall('aa|bb|cc',t)
>>> line1
['aa', 'bb', 'cc']
目前来看,两个符合不能共同使用,会冲突,如下面的例子:
>>> line1=re.findall('[aabbcc]',t)
>>> line1
['a', 'a', 'b', 'b', 'c', 'c']
>>> line1=re.findall('[aa|bb|cc]',t)
>>> line1
['a', 'a', 'b', 'b', 'c', 'c']
# 也就是说[] 内 | 失去了作用,一直都没发现
>>> line1=re.findall('aa|bb|cc',t)
>>> line1
['aa', 'bb', 'cc']
2.4 re.match() 用法(待重新整理)
#2
Ret=re.match("(\d+)([+-])(\d+)",T)#数字 + - 数字
\d+ 0-9任意数字一次或任意次
#4
Words=re.findall("(\S+)\(",Line)
S不加空格的,+至少一个,以(结束的最长字符串
#5
words = re.findall(r'(\S+)\/(\S+)',line)
寻找以非空字符开始,非空字符结束,中间是/符号的一组字符
如:当/p
#6
PYs=re.findall("\(([^\(\)]+)\)",Line)
以(开始,以)结束,中间没有()的
#8
PYs=re.findall("\((.*?)\)",Line
以(开始,以)结束,
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
2.5 re.findall()用法
2.5.1 一般用法
#4
Words=re.findall("(\S+)\(",Line)
S不加空格的,+至少一个,以(结束的最长字符串
#5
words = re.findall(r'(\S+)\/(\S+)',line)
寻找以非空字符开始,非空字符结束,中间是/符号的一组字符
如:当/p
#6
PYs=re.findall("\(([^\(\)]+)\)",Line)
以(开始,以)结束,中间没有()的
#8
PYs=re.findall("\((.*?)\)",Line
以(开始,以)结束,
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
2.6 .re.search()用法
在这里插入代码片
2.7 re.sub()用法
Sentences=re.sub(r'[^\u4e00-\u9fa5]','',str(Sentences))
替换掉所有非中文字符
版权声明:本文为qq_44418077原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。