小程序
传感搜
传感圈

python语言之正则re使用方法

2022-08-23
关注

. \w \s \d a|b () [...] {} * +

1. 常用元字符

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线

\s 匹配任意的空白符

\d 匹配数字

\n 匹配一个换行符

\t 匹配一个制表符

^ 匹配字符串的开始

$ 匹配字符串的结尾

\W 匹配非字母或数字或下划线

\D 匹配非数字

\S 匹配非空白符

a|b 匹配字符a或字符b

() 匹配括号内的表达式,也表示一个组

[...] 匹配字符组中的字符

[^...] 匹配除了字符组中字符的所有字符


2. 量词:控制前面的元字符出现的次数


* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,} 重复n次或更多次


3. 贪婪匹配和惰性匹配


.* 贪婪匹配

.*? 非贪婪匹配


'''

点: 匹配所有不包括换行

+: 表示重复一次或者更多次,就是说如果条件一直符合的话,就连续匹配

import re

def test_dot():
data1 = 'hello \n world'
pattern = re.compile(r'.+')
res_list = pattern.findall(data1)
assert ['hello ', ' world'] == res_list, 're dot error'

2.点: 匹配所有包括换行

import re
def test_dot2():
# 有时候需要 . 能匹配所有字符,包括换行符, 就需要带上参数 re.S
data1 = ''

# (.+) 括号说明: 正常会取整个,加括号之后,就只取括号里面的了
ptn = re.compile(r'', re.S)
res_list = ptn.findall(data1)
assert ['hello \n world'] == res_list, 're dot 2 error'

3. \w: 匹配数字、字母 和 下划线

import re
def test_w():
data1 = 'ab_@.121'
# + 表示重复一次或者更多次,就是说如果条件一直符合的话,就连续输出,比如:ab_
ptn = re.compile(r'\w+')
res_list = ptn.findall(data1)
assert ['ab_', '121'] == res_list, 're w error'

4.\s: 匹配任意的空白字符

import re
def test_s():
data1 = 'a b\tc\n d$#'
ptn = re.compile(r'\s+')
res_list = ptn.findall(data1)
assert [' ', '\t', '\n '] == res_list, 're s error'

5.\d: 匹配数字

import re
def test_d():
data1 = 'yidong 10086,liantong 10010'
ptn = re.compile(r'\d+')
res_list = ptn.findall(data1)
assert ['10086', '10010'] == res_list, 're d error'

6.^: 有两个地方用到: 1.本例中的匹配字符串的开始, 2. 在中括号中,取非

import re
def test_start():
data1 = 'ab1ab2'
ptn = re.compile(r'ab\d')
res_list = ptn.findall(data1)
assert ['ab1', 'ab2'] == res_list, 're ^ error'

# ^ 表示只匹配字符串的开始
data1 = 'ab1ab2'
ptn = re.compile(r'^ab\d')
res_list = ptn.findall(data1)
assert ['ab1'] == res_list, 're ^ 2 error'

7.$: 匹配字符串的结束

import re
def test_end():
data1 = '1ab2ab'
ptn = re.compile(r'\dab$')
res_list = ptn.findall(data1)
assert ['2ab'] == res_list, 're $ error'

8. |: a|b 匹配字符串a或字符串b

import re
def test_and():
data1 = '12a_3$dc'
ptn = re.compile(r'\d+|a|d|c')
res_list = ptn.findall(data1)
assert ['12', 'a', '3', 'd', 'c'] == res_list, 're | error'

9. (): 表示一个组

import re
def test_bracket():
data1 = ''
ptn = re.compile(r'')
res_list = ptn.findall(data1)
assert ('1', 'xiaoxinmiao') == res_list[0], 're () error'

10. (): 可以通过?P定义组名

import re
def test_bracket2():
# 可以设置分组名
data1 = ''
ptn = re.compile(r'')
iter_obj = ptn.finditer(data1)
res_obj = iter_obj.__next__()
assert '1' == res_obj.group(
'id') and 'xiaoxinmiao' == res_obj.group('name'), 're () error'

11.(): 当有多组时的例子, 当然这种情况,直接用例子9更方便

import re
def test_bracket3():
# 可以设置分组名
data1 = ''
ptn = re.compile(
r'')
iter_obj = ptn.finditer(data1)
ids, names = [], []
for i in iter_obj:
ids.append(i.group('id'))
names.append(i.group('name'))
assert ['1', '2'] == ids and ['miao1', 'miao2'] == names, 're () error'

12.[]: 匹配字符串中的字符, 其中 - 表示区间,例如:1-9表示1,2,3,4,5,6,7,8,9

import re
def test_bracket_mid():
data1 = '12dss#$$fwe564_'
ptn = re.compile(r'[1-9a-z_$]+')
res_list = ptn.findall(data1)
assert ['12dss', '$$fwe564_'] == res_list, 're [] error'

13.[^]: 匹配除了字符串中的值

import re
def test_bracket_mid2():
data1 = '12dss#$$fwe564_'
# [^] 表示不匹配里面的任何数
ptn = re.compile(r'[^1-9a-z_$]+')
res_list = ptn.findall(data1)
assert ['#'] == res_list, 're [] error'

14. +, * , ? 的理解,但是并不常用, 最常用的还是这个组合 .*?


def test_liangci():
data1 = 'abccd'
# +: 前一个字符出现1次或者多次
re_list = re.findall(r'abc+', data1)
assert ['abcc'] == re_list, 're + error'

# *: 前一个字符出现0次或者多次
re_list = re.findall(r'abf*', data1)
assert ['ab'] == re_list, 're + error'

# ?: 前一个字符出现0次或者1次
re_list = re.findall(r'abc?', data1)
assert ['abc'] == re_list, 're + error'

16. .*?: 非贪婪模式, 直接看例子

import re
def test_star2():
# .* 贪婪
data1 = '我爱北京天安门,天安门上太阳升.'
res_list = re.findall(r'我爱(.*)天安门', data1)
assert ['北京天安门,'] == res_list, 're .* error'
# .*? 非贪婪
res_list = re.findall(r'我爱(.*?)天安门', data1)
assert ['北京'] == res_list, 're .* error'

17. {}: {n}重复多次,{n,}重复多次或者更多次

import re
def test_bracket_big():
# 只有两位数字才符合要求
data1 = 'a1b12c134d1234e'
res_list = re.findall(r'\d{2}', data1)
assert ['12', '13', '12', '34'] == res_list, r're {} error'
# 两位,以及两位以上的数字都符合要求
data1 = 'a1b12c134d1234e'
res_list = re.findall(r'\d{2,}', data1)
assert ['12', '134', '1234'] == res_list, r're {} error'

18. []: 实战,匹配中文

import re
def test_zh():
data1 ='我爱111北京%天安


审核编辑:刘清

您觉得本篇内容如何
评分

评论

您需要登录才可以回复|注册

提交评论

电子发烧友

这家伙很懒,什么描述也没留下

关注

点击进入下一篇

“阴阳热搜”,怎么骗过了你的眼睛?

提取码
复制提取码
点击跳转至百度网盘