正则表达式,英文名: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']
表达式、前后、
参考
菜鸟正则:https://www.runoob.com/python/python-reg-expressions.html