python正则表达式学习及其运用实例(陆续更新)

  • Post author:
  • Post category:python







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 版权协议,转载请附上原文出处链接和本声明。