python正则表达式

it2025-07-14  1

忌死记硬背,多敲代码,多用

文章目录

一: re.search()方法1:‘.’ 匹配任何字符2:\d 匹配数字3: [...]4:{n}:匹配次数5:正则表达式是以字符形式匹配6:匹配ip地址7:'\\数字'的作用(这个不太懂)8:+ * ?9:^ $10:\b 二:re.findall()三:re.compile()四:re.VERBOSE五 group end start span其他详情请见

一: re.search()方法

re.search 扫描整个字符串并返回第一个成功的匹配。

#re.serch(r'正则表达式模式','字符串') 扫描整个字符串并返回第一个成功的匹配 # 如果匹配不到则返回none(什么都不返回) >>> import re >>> re.search(r'dog', 'I love dog') #<_sre.SRE_Match object; span=(7, 10), match='dog'>
1:‘.’ 匹配任何字符

'\.‘匹配’.'字符

>>> re.search(r'.', 'I love handsome boy') #<_sre.SRE_Match object; span=(0, 1), match='I'> >>> re.search(r'lov.', 'I love handsome boy') #<_sre.SRE_Match object; span=(2, 6), match='love'> >>>
2:\d 匹配数字
>>> re.search(r'\d\d\d\.\d\d\d.\d', 'this is 123.123.1') #<_sre.SRE_Match object; span=(8, 17), match='123.123.1'> >>>
3: […]

正则表达式默认开启大小写敏感模式 [abcdef] 匹配[]中的任何一个字符 [a-z] a到z中的任和一个字符 :‘-’表示范围

>>> re.search(r'[aeiou]', 'I love cat') #<_sre.SRE_Match object; span=(3, 4), match='o'> >>> re.search(r'[a-z]', 'I love hansome boy') #<_sre.SRE_Match object; span=(2, 3), match='l'>
4:{n}:匹配次数

{n}前面紧挨着它的字符重复匹配n次 {m,n}匹配m到n次都可以 :(m,n)之间不能有空格

#'c'重复匹配2次 >>> re.search(r'abc{2}', 'abcc') #<_sre.SRE_Match object; span=(0, 4), match='abcc'> >>> re.search('abc{2,5}', 'abcccc') #<_sre.SRE_Match object; span=(0, 6), match='abcccc'> >>> re.search(r'ab{2,3}c', 'abbc') #<_sre.SRE_Match object; span=(0, 4), match='abbc'> >>> re.search(r'ab{2,3}c', 'abbbbc') #匹配不成功
5:正则表达式是以字符形式匹配

[0-255] :匹配字符‘0 到2’以及字符‘5’

#匹配不成功 >>> re.search(r'[0-255]', '67') >>> re.search(r'[0-255]', '5') #<_sre.SRE_Match object; span=(0, 1), match='5'> #匹配不成功 >>> re.search(r'[0-255]', '0') #<_sre.SRE_Match object; span=(0, 1), match='0'> #匹配不成功 >>> re.search(r'[0-255]', '3') >>> re.search(r'[0-255]', '2') #<_sre.SRE_Match object; span=(0, 1), match='2'> #匹配不成功 >>> re.search(r'[0-255]', '4') >>> re.search(r'[0-255]', '1') #<_sre.SRE_Match object; span=(0, 1), match='1'>
6:匹配ip地址

(ip数字范围0-255):4数3‘.’

#([01]\d\d|2[0-4]\d|25[0-4])匹配的数字为3位,最大到255 #'|'或者 #第一种情况:第一位数字为0或1,第二位第三位任意 #第二种情况:第一位数字为2,第二位数字为0-4,第三位数字任意 #第三种情况:第一位数字为2,第二位数字为5,第三位数字为0-5 #三种情况或起来匹配到的数字即为3位数字,最大到255 ''' 但是需要匹配的数字范围是0-255,我们不会把0写成000, 所以上述式子的第一种情况下前两位(即[01]和\d) 匹配的次数为0次或1次({0,1}一般不用这种方式,而是用?代替->) ([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-4])-> ([01]?\d?\d|2[0-4]\d|25[0-4]) ''' >>> re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-4])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-4])', '123.123.123.1') #<_sre.SRE_Match object; span=(0, 13), match='123.123.123.1'>
7:’\数字’的作用(这个不太懂)
>>> re.search(r'(hello)(world)\2', 'helloworldworld') #<_sre.SRE_Match object; span=(0, 15), match='helloworldworld'> >>> re.search(r'(fish)\060', 'fishfish0') #<_sre.SRE_Match object; span=(4, 9), match='fish0'> >>> re.search(r'(fish)\141', 'fishfisha') #<_sre.SRE_Match object; span=(4, 9), match='fisha'>
8:+ * ?
* :等价于{0,},匹配0个或多个+:等价于{1,},匹配1个或多个?:等价于{0,1}:匹配0个或1个 >>> s = '<html><title>I love cat</title></html>' #匹配<中间一个或多个任意字符> #贪婪模式匹配,尽可能多的匹配 >>> re.search(r'<.+>', s) #<_sre.SRE_Match object; span=(0, 38), match='<html><title>I love cat</title></html>'> #非贪婪模式匹配(这里的?是以非贪婪模式匹配) >>> re.search(r'<.+?>', s) #<_sre.SRE_Match object; span=(0, 6), match='<html>'>
9:^ $

^:匹配字符串的开头 $:匹配字符串的末尾 设置密码的要求

# 匹配由a-zA-Z0-9_.字符组成的6-9位字符串 #匹配不成功,开头字符不符合条件 >>> re.search(r'^[a-zA-Z0-9_.]{6,9}$', '@sdasdasd') #匹配不成功,位数不符合条件 >>> re.search(r'^[a-zA-Z0-9_.]{6,9}$', 'sdasdasd1234') >>> re.search(r'^[a-zA-Z0-9_.]{6,9}$', 'sdasdasd1') #<_sre.SRE_Match object; span=(0, 9), match='sdasdasd1'>
10:\b

匹配一个单词边界,也就是指单词和空格间的位置

#先字符,再边界 n\b #匹配不到 >>> re.search(r'h\b', 'hello') >>> re.search(r'h\b', 'elloh') #<_sre.SRE_Match object; span=(4, 5), match='h'> >>> re.search(r'h\b', 'h ello') #<_sre.SRE_Match object; span=(0, 1), match='h'> #先边界,再字符 \bn >>> re.search(r'\bh', 'hello') #<_sre.SRE_Match object; span=(0, 1), match='h'>

二:re.findall()

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

>>> re.findall(r'[a-z]', 'I love cat') #['l', 'o', 'v', 'e', 'c', 'a', 't']

三:re.compile()

如果需要重复使用某个正则表达式,可以先将该表达式编译成模式对象

>>> p = re.compile(r'[a-z]+') >>> p.search('I love cat!!!') #<_sre.SRE_Match object; span=(2, 6), match='love'> >>> p.findall('I love cat!!!') #['love', 'cat']

四:re.VERBOSE

让正则表达式写起来更加有条理,空格会被省略掉(除了出现在字符串中的空格和被转移的空格),支持#内容注释 1不用这个标志

>>> p = re.compile(r'&#(0[0-7]+|[0-9]+|x[0-9a-fA-F]+);') >>> p.search('&#xf;') #<_sre.SRE_Match object; span=(0, 5), match='&#xf;'>

2用这个标志

import re patt = re.compile(r""" &[#] #开始数字引用, [#]被转义 ( 0[0-7]+ #八进制数字 | [0-9] + #十进制数字 | x[0-9a-fA-F]+ #十六进制数字 ) ; #结尾分号 """, re.VERBOSE) #>>> patt.search('&#xf;') #<_sre.SRE_Match object; span=(0, 5), match='&#xf;'>

五 group end start span

>>> result = re.search(r'(\w+) (\w+)', 'I love cat!!') >>> result #<_sre.SRE_Match object; span=(0, 6), match='I love'> #转换为字符串 >>> result.group() #'I love' #第一组 >>> result.group(1) #'I' #第二组(空格不算) >>> result.group(2) #'love' #匹配起始位置 >>> result.start() #0 #匹配结束位置 >>> result.end() #6 #匹配范围 >>> result.span() #(0, 6) >>>

关于group

#一个()算一个组,下面这个例子有两个组 >>> s = re.match( r'(.*) are (.*?) .*', "Cats are smarter than dogs") >>> s <_sre.SRE_Match object; span=(0, 26), match='Cats are smarter than dogs'> >>> s.group() 'Cats are smarter than dogs' >>> s.group(1) 'Cats' >>> s.group(2) 'smarter' #group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 >>> s.group(1, 2) ('Cats', 'smarter') # 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 >>> s.groups() ('Cats', 'smarter')

其他详情请见

菜鸟教程正则表达式

最新回复(0)