前言 正则表达式可以在文本处理和文本清洗中发挥巨大的作用,有时候能够承担起一部分的信息提取工作。
基础符号
符号
作用
解释
记忆
^
匹配开头
^a表示匹配以a开头的字符串
-
$
匹配结尾
a$表示匹配以a结尾的字符串
买完菜东西就要付钱
?
匹配0次或1次
a?表示匹配a0次或者1次
你到底有没有青菜卖?
*
匹配0次或无数次
a*表示匹配a0次或者无数次
我比较有钱,没有青菜就算了,如果有多少我要多少,多给你几倍钱
+
匹配1次或无数次
a+表示匹配a1次或者无数次
只要你有青菜,我就多加几颗
\n
匹配换行
-
-
\s
匹配任意空白字符
相当于\t、\n、\r、\f这些
space,空格
\S
匹配任意非空白字符
-
小的不要的我都要
\d
匹配阿拉伯数字
匹配0-9这十个阿拉伯数字
digit,数字
\D
匹配任意非数字
-
小的不要的我都要
\w
匹配字母数字及下划线
相当于匹配数字0-9、大小字母a-zA-Z还有下划线
(我的)word账号只支持字母数字和下划线
\W
匹配非字母数字及下划线
-
大的不要的我都要
[\u4e00-\u9fa5]
匹配中文
-
很难记住,要用就去查
{}
一般用在限定匹配次数
a{1,}表示匹配a1次以上,相当于+;a{2,7}表示匹配a2到7次;a{6}表示匹配a6次
我比问号、加号、乘号都厉害
[]
出现在这个中括号里面的字符都会被单个匹配
[abc]匹配a,b或者c
疫情紧张,超市限购,青菜每个人只能买一颗
[^]
出现在这个中括号里面^后面字符都不会被单个匹配
[^abc]不匹配a,b或者c
超市还没开门,开头来的几个人都没买到菜
|
满足多个正则表达式
a|b|c表示匹配a或者b或者c,不同于[],|可以匹配字符串或者满足不同正则的字符串
有多个表达式或者要匹配多个字符串就找我,我比[]强大
寻找 re.match 功能描述: 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。import retext = '时间:2020年6月22日' if re.match(r'[时间日期]{0,2}[::]?' , text): print('这句话以日期标示开头' )
re.match(r’abc’)相当于re.search(r’^abc’)
re.search 功能描述: 扫描整个字符串并返回第一个 成功的匹配,它可以用来判定每个表达式满足的字符串是否在文本中。
import relist_1 = ['出生年月:1992.3.19' , '生日:1992.3.19' , '出生日期:1992.3.19' , '生日 92.03.19' ] print([item for item in list_1 if re.search(r'[出生]{1,2}[日年][月期]?[::]?' , item)])
import relist_2 = ['18826229080' , '188-2622-9080' , '188-26229080' , '86-18826229080' , '188--2622--9080' ] print([item for item in list_2 if re.search(r'(86)?[-]*1[3-9]\d[-]*\d{4}[-]*\d{4}' , item)])
import relist_3 = ['工作经验' , '工作履历' , '【工作经验】' , '「工作经验」' , '工作背景' ] print([item for item in list_3 if re.search(r'[「【]?工作[经履][历验][】」]?[::]?[\n\s]?|工作背景[\n\s]?' , item)])
提取 re.findall 功能描述: 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
import restring = 'abcdefg acbdgef abcdgfe cadbgfe' print(re.findall(r'((\w+)\s+\w+)' , string)) print(re.findall(r'(\w+)\s+\w+' , string)) print(re.findall(r'\w+\s+\w+' , string))
re.search 功能描述: 扫描整个字符串并返回第一个 成功的匹配。
import reprint(re.search(r'广州' , '我在广州读书,然后在广州工作' ).group()) print(re.search(r'广州' , '我在广州读书,然后在广州工作' ).span())
re.finditer 功能描述: 他可以看作是对re.search的补充,通过re.search只能获取到第一个 成功的匹配,但是它可以获取到所有的成功的匹配。
import redef extract_time_period (text ): """ 日期段的抽取正则 :param text: :param segment: :return: """ date_regex = r'[1,2][0,9]\d{2}[/年\-–-—.]([0-1]?\d月?([/\-–-—.][0-3]?\d日?)?)?' hyphen_regex = r'[—―–-\-\~~到]{1,2}[至今现在]{0,2}' period_regex = date_regex + hyphen_regex + date_regex + r'|' + date_regex + hyphen_regex dates = re.finditer(period_regex, text, re.DOTALL) return [date.group() for date in dates if dates is not None ] text = '2019年3月-2020年3月,2019年3月~2020年3月,2019年3月~至今,1992.3.19--2000.3.19,2020/03/11~2021/05/22' print(extract_time_period(text))
替换 replace 它的局限在于你无法使用正则。
re.sub 功能描述: 用于替换字符串中的匹配项。
print(re.sub(r'abc' , '贤' , '我是abc' ))
print(re.sub(r'\s*,\s*' , ',' , '我 , 是贤' ))
print(re.sub(r'(,){2,}' , r'\1' , '我,,,是首贤' )) print(re.sub(r'([a-zA-Z\u4e00-\u9fcc])\1{1,2}' , r'\1' , '我我是是首首贤贤aabbcc' ))
分割 split 它的局限在于你无法使用正则。
re.split 功能描述: 按照能够匹配的子串将字符串分割后返回列表。
print(re.split(' ' , 'hello world' )) print(re.split('\W+' , '我,是,首贤' )) print(re.split(r'a+' , 'hello world' ))
更多操作 相关参数 print(re.search(r'qq' , 'QQ' , re.I))
text = '我是首贤 \n \ 我来自地球' print(re.findall(r'我' , text, re.S))
综合利用 import retext = '我 是 首贤 \n \ 我来 自 地球 ' content_list = re.split(r'\n' , text) content_list = [re.sub(r'\s' , '' , line) for line in content_list if line != '' ] content = '\n' .join(content_list) print(content)