【python】正则表达式

正则表达式,英文名:regular expression/regex/re

[1]代表是否有1,[13]代表有1或者3

import re # 导入re模块
pattern = re.compile(r'[1]')                     # 设置正则规则 : 是否有1
result = pattern.findall('1122334')              # 进行正则查找 
print(result)                                    # 返回 ['1','1']

匹配数量

匹配字符正则 + 匹配数量正则 = 连续匹配N个字符正则

以下匹配结果均使用finall查找

正则 解释 原始字符串 匹配规则 匹配结果
? 匹配0个或1个 111223: [1]? [‘1’, ‘1’, ‘1’, ”, ”, ”, ”]
* 匹配0个或多个 111223: [1]* [‘111’, ”, ”, ”, ”]
+ 匹配1个或多个 111223: [1]+ [‘111’]
{3} 匹配3个 111223: [1]{3} [‘111’]
{3,5} 匹配3~5个 1114223: [12]{2,5} [‘111′, ’22’]
{2,} 最少匹配2个 1114223: [12]{2} [’11’, ’22’]
{,6} 最多匹配6个(最少0个) 1114223: [12]{,4} [‘111′, ”, ’22’, ”, ”]

非贪婪模式:.+ 改为.+?

单字符(普通)

[]里写多少内容,都只能匹配一个字符

[aeiou] 匹配中括号内的任意一个字母 Ab34d [abc] [‘b’]
[0-9] 匹配任何数字。等同于[0123456789] Ab34d [0-9] [‘3’, ‘4’]
[a-z] 匹配任何小写字母 Ab34d [a-z] [‘b’, ‘d’]
[A-Z] 匹配任何大写字母 Ab34d [A-Z] [‘A’]
[a-zA-Z0-9] 匹配任何字母及数字 Ab34d [a-zA-Z0-9] [‘A’, ‘b’, ‘3’, ‘4’, ‘d’]
[^aeiou] 除了aeiou字母以外的所有字符 Ab34d [^ab3] [‘A’, ‘4’, ‘d’]
[^0-9] 匹配除了数字外的字符 Ab34d [^0-9] [‘A’, ‘b’, ‘d’]

单字符(特殊)

a、b、3、m、q 普通字符,写什么就是什么 Ab34d A [‘A’]
. 匹配除 “\n” 之外的任何单个字符。 Ab34d . [‘A’, ‘b’, ‘3’, ‘4’, ‘d’]
\d 匹配一个数字。等价于 [0-9]。 Ab34d \d [‘3’, ‘4’]
\D 匹配一个非数字。等价于 [^0-9]。 Ab34d \D [‘A’, ‘b’, ‘d’]
\s 匹配任何空白字符,空格、制表符、换页符等。等价于 [\f\n\r\t\v]。 Ab34d \s []
\S 匹配任何非空白字符。等价于 [^\f\n\r\t\v]。 Ab34d \S [‘A’, ‘b’, ‘3’, ‘4’, ‘d’]
\w 匹配英文和数字+下划线。等价于'[A-Za-z0-9_]’。 Ab34d \w [‘A’, ‘b’, ‘3’, ‘4’, ‘d’]
\W 匹配非英文和数字+下划线。等价于 ‘[^A-Za-z0-9_]’ Ab34d \W []

位置匹配

限定:出现在首尾或者特定字符前后

^ 匹配字符串的开头 010-345 ^01.+- [‘010-‘]
$ 匹配字符串的末尾。 010-345 -.+5$ [‘-345’]
\A 匹配字符串的开头,忽略m标记 re.M标记后面讲
\Z 匹配字符串的末尾。忽略m标记 re.M标记后面讲
\b 匹配一个单词边界,也就是指单词和空格间的位置。 hello world .+lo\b [‘hello’]
\B 匹配非单词边界。 alpha bath happy \S+h\B [‘alph’]
(?:…) 匹配表达式,但捕获分组 abc a(?:b) [‘ab’]  # 匹配ab,  但是不捕获b分组
(?=…) 匹配后缀,捕获前面的分组,但捕获该后缀 abc a(?=b) [‘a’]    # a有b后缀,匹配a,不捕获b分组
(…) 捕获分组,并记住匹配的文本 abc a(b) [‘b’]    # 匹配b,  并捕获b分组
(?!…) 如果没有后缀,则匹配 abc a(?!c) [‘a’]     # a没有c后缀,可以匹配a
(?<=…) 匹配前缀,但不捕获前缀 cab (?<=a)b [‘b’]      #b有a前缀,可以匹配b,但不捕获a分组
(?<! …) 匹配前缀不是该表达式 abcba (?<!a)b [‘b’]       #不能匹配ab,但是后面的cb可以
(?()|)

分组

a| b 匹配a或b
(re) 捕获分组,并记住匹配的文本
\1…\9 匹配第n个分组的内容。
(?P<Y>…) 捕获组名为Y
(?:…) 不捕获组
(?P=Y) 匹配名为Y的组
(?#…) 注释

标记

i 忽略大小写
m ^和$匹配行首和行尾
s .可以匹配换行符了
x 允许空格和注释
\L 由当前语音区域觉得 \w\W\b\B和大小写敏感匹配
\u Unicode匹配
(?iLmsux) 在正则表达式中设置标记

特殊符号

\r 回车符
\n 换行符
\t 水平制表符
\v 垂直制表符
\f 换页符
\YYY 八进制符号YYY
\xYY 16进制符号YY

替换

\g<0> 插入整段匹配
\g<Y> 插入匹配Y,Y可以是匹配的名字或者数字
\Y 插入名为Y的组

单字符匹配示例

import re

# 1 [aeiou] 任意一个字符
pattern1 = re.compile(r'[125]+')   # 查找含有1、2或5的数字 并且至少有1个
result = pattern1.findall('1122334455') 
# 返回['1122', '55'] -- 不包括4,所以4左边的和右边的都能匹配

# 2 [0-9] 匹配任何数字
pattern2 = re.compile(r'[0-9]+')   # 查找数字串
result = pattern2.findall('010-326-468')
# 返回 ['010', '326', '468'] -- 查找连在一起的数字

# 3、4 同 #2

# 6 [a-zA-Z0-9] 匹配任意数字或字母
pattern6 = re.compile(r'[a-zA-Z0-9]+')
result = pattern6.findall('My id is 010-326')

# 7 [^aeiou] XX字符以外
pattern7 = re.compile(r'[^ids 01-]+')   #查找i、d、s、0、1、-、空格、以外的字符对
result = pattern7.findall('My id is 010-356')
# 返回 ['My', '356']

print(result)

 

特殊字符类案例

1.srt字幕提取时间码

import re
pattern = re.compile(r'.+ --> .+')
srt = '''1
00:00:03,301 --> 00:00:03,870
嗨
hi
'''
result1 = pattern.findall(srt)
print(result1)
# 返回 00:00:03,301 --> 00:00:03,870

 

2.srt字幕提取序号戳

import re
pattern = re.compile(r'\d+\n\d')
srt = '''
1
00:00:03,301 --> 00:00:03,870
嗨
hi

2
00:00:06,321 --> 00:00:08,130
你好
hello
'''
result1 = pattern.findall(srt)
# 返回 ['1\n0', '2\n0']

 

表达式、前后、

 

 

给TA充电
共{{data.count}}人
人已充电
杂记编程

【python】爬取大众脸插件发布时间和标题

2021-8-1 11:23:23

杂记编程

【python】剪映字幕导出

2021-8-1 11:30:39

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
搜索