一、正则表达式
re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,
而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。
- re模块是python独有的
- 正则表达式所有编程语言都可以使用
- re模块、正则表达式是对字符串进行操作
(一)常用正则
1、字符组
在同一个位置可能出现的各种字符
组成了一个字符组
,在正则表达式中用[]
表示
正则 | 说明 |
---|---|
[a-z] | 匹配所有的小写字母 |
[A-Z] | 匹配所有的大写字母 |
[0-9] | 匹配所有的数字 |
2、字符
元字符 | 匹配内容 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
\W | 匹配非字母或数字或下划线 |
\D | 匹配非数字 |
\S | 匹配非空白符 |
a|b | 匹配字符a或字符b |
() | 匹配括号内的表达式,也表示一个组 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符的所有字符 |
3、量词
贪婪模式:(按照对大情况匹配)
量词 | 用法说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
\1 \2 | 表示前面第一个名为1的分组,和第二个小括号的分组 |
4、例子
(1)非
^(?!.*200).*$
,只匹配200
^(?!.*[200|400]).*$
,只匹配200和400
(2)\u4e00-\u9fa5 中文
二、re模块
(一) r表示:不允许字符串进行转义
a="\\hello"
b=r"\\hello"
print(a)
print(b)
# \hello
#\\hello
(二)常量、属性
修饰符 | 描述 |
---|---|
re.I(re.IGNORECASE) | 使匹配对大小写不敏感 |
re.L(re.LOCALE) | 做本地化识别(locale-aware)匹配 |
re.M(re.MULTILINE) | 多行匹配,影响 ^ 和 $ |
re.S(re.DOTALL) | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
(三)函数
1、re.compile(pattern[, flags])
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用
-
pattern
: 一个字符串形式的正则表达式 -
flags
: 可选,表示匹配模式,比如忽略大小写,多行模式等具体为:re.I、re.L 、re.M 、re.S 、re.U 、re.X
2、re.match(pattern, string, flags=0)
match 尝试从字符串的起始位置
匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
-
pattern
:匹配的正则表达式 -
string
: 要匹配的字符串。 -
flags
: 可选,表示匹配模式
3、re.search(pattern, string, flags=0)
search 扫描整个字符串
并返回第一个成功的匹配。
-
pattern
:匹配的正则表达式 -
string
: 要匹配的字符串。 -
flags
: 可选,表示匹配模式
re.match与re.search的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
4、 re.sub(pattern, repl, string, count=0, flags=0):正则表达式替换函数
-
pattern
:模式串 -
repl
:需要替换成的字符串或函数 -
string
:需要被替换的字符串 -
count
:替换次数 - 特殊用法:
\数字
和\g<数字>
表示前面pattern里面第数字
个分组,需要和r'\数字'
联用,否则不好用,\g<0>,\0
代表前面pattern匹配到的所有字符串。
import re
text="2020年10月14日"
text=re.sub(r"[\u4e00-\u9fa5]","-",text,2).strip("日")
#2020-10-14
c= 'abc124hello46goodbye67shit'
c=re.sub(r'\d+[hg]', 'foo1', c)
# abcfoo1ellofoo1oodbye67shit
a1 = re.sub('(\d{2})-(\d{2})-(\d{4})', r'\3-\1-\2', '06-07-2018')
a2 = re.sub('(\d{2})-(\d{2})-(\d{4})', r'\g<3>-\g<2>-\g<1>', '06-07-2018')
a3 = re.sub(r'(\d{4})(\d{2})(\d{2})', r'\1-\2-\3', '20201010')
#a1=2018-06-07
#a2=2018-06-07
#a3=2020-10-10
def replace_num(str):
numDict = {
"0": "〇",
"1": "一",
"2": "二",
"3": "三",
"4": "四",
"5": "五",
"6": "六",
"7": "七",
"8": "八",
"9": "九",
}
#要用.group()取文本,因为是匹配出来的是对象
print(str.group())
return numDict[str.group()]
my_str = "2018年6月7号"
a = re.sub(r"(\d)", replace_num, my_str)
print(a)
# 二〇一八年六月七号,每次匹配一个数字,执行函数,获取替换后的值
5、re.split(pattern, string, maxsplit=0)
- 多个 分隔符,切割功能非常强大
- 通过正则表达式将字符串分离。
- 如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。
- maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。
(1) 单字符切割:
re.split(';',line)
['aa bb cc dd', ' ee ff. gg- hh ii kk']
(2) 两个字符以上切割,放在 [ ]
中(不保留分隔符):
re.split('[;.-]',line)
['aa bb cc dd', ' ee ff', ' gg', ' hh ii kk']
(3) 使用( )
捕获分组(保留分割符):
re.split('([;,])',line)
['aa bb cc dd', ';', ' ee ff', '.', ' gg', '-', ' hh ii kk']
def process(text):
"""
eg:安徽省住房和城乡建设厅党组书记、厅长 赵馨群
eg:省工商局局长 朱斌 省商务厅副厅长 乔兴力
空格分割,多个的,长多于3的不要
"""
import re
res=text.split()
print(res)
if len(res)>1:
return [i.replace(" ", "") for i in res if 1 < len(i) < 4]
if len(res)==1:
return [i.replace(" ", "") for i in res]
else:
return text
6、findall(string[, pos[, endpos]])
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
-
string
: 待匹配的字符串。 -
pos
: 可选参数,指定字符串的起始位置,默认为 0。 -
endpos
: 可选参数,指定字符串的结束位置,默认为字符串的长度。
7、方法
-
group([group1, …])
:方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0); -
groups()
:返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 -
start()
:返回匹配开始的位置 -
end()
:返回匹配结束的位置 -
span()
:返回一个元组包含匹配 (开始,结束) 的位置
网友评论