忌死记硬背,多敲代码,多用
re.search 扫描整个字符串并返回第一个成功的匹配。
#re.serch(r'正则表达式模式','字符串') 扫描整个字符串并返回第一个成功的匹配 # 如果匹配不到则返回none(什么都不返回) >>> import re >>> re.search(r'dog', 'I love dog') #<_sre.SRE_Match object; span=(7, 10), match='dog'>'\.‘匹配’.'字符
>>> 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'> >>>正则表达式默认开启大小写敏感模式 [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'>{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') #匹配不成功[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'>(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'>^:匹配字符串的开头 $:匹配字符串的末尾 设置密码的要求
# 匹配由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'>匹配一个单词边界,也就是指单词和空格间的位置
#先字符,再边界 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(r'[a-z]', 'I love cat') #['l', 'o', 'v', 'e', 'c', 'a', 't']如果需要重复使用某个正则表达式,可以先将该表达式编译成模式对象
>>> 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']让正则表达式写起来更加有条理,空格会被省略掉(除了出现在字符串中的空格和被转移的空格),支持#内容注释 1不用这个标志
>>> p = re.compile(r'&#(0[0-7]+|[0-9]+|x[0-9a-fA-F]+);') >>> p.search('') #<_sre.SRE_Match object; span=(0, 5), match=''>2用这个标志
import re patt = re.compile(r""" &[#] #开始数字引用, [#]被转义 ( 0[0-7]+ #八进制数字 | [0-9] + #十进制数字 | x[0-9a-fA-F]+ #十六进制数字 ) ; #结尾分号 """, re.VERBOSE) #>>> patt.search('') #<_sre.SRE_Match object; span=(0, 5), match=''>关于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')菜鸟教程正则表达式