Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save caoya171193579/2ed293f1daf116495bdcf2fa3996d34a to your computer and use it in GitHub Desktop.
Save caoya171193579/2ed293f1daf116495bdcf2fa3996d34a to your computer and use it in GitHub Desktop.
进阶
\ : 反斜杠,转义字符。
前言:
>>> import re
>>> r = r"^abc" #定义规则为开头是abc的字符集
>>> re.findall(r,'abc')
['abc']
>>> re.findall(r,'adcsds') #与规则不同则会返回空列表
[]
>>> re.findall(r,'^abc')
[]
#当我们想让元字符^尖角号不起作用,我们就用元字符\ 来做转译让^只做为字符串里面的值。
>>> r = r"\^abc" #我们的规则使用了\ ,^就不起作用了 。
>>> re.findall(r,'^abc')
['^abc']
>>> re.findall(r,'^abc ^abc ^abc') #用规则匹配多个 ^abc。
['^abc', '^abc', '^abc']
>>>
\ :反斜杠后面可以加不通的字符以表示不同特殊意义。
也可以用于取消所有的元字符: \[ 或 \\
\d 匹配任何十进制数; 它相当于类 [0-9]。 规则是匹配数字中的任何。
>>> r = r"\d"
>>>
>>> r
'\\d'
>>> re.findall(r,'123')
['1', '2', '3']
>>> re.findall(r,'123456789')
['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> re.findall(r,'1234567890')
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
>>> re.findall(r,'12345678910')
['1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '0']
>>> re.findall(r,'1234567891011')
['1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '0', '1', '1']
\D 匹配任何非数字字符,它相当于类 [^0-9]。规则是匹配除了数字的任何。
>>> r = r"\D"
>>>
>>> r
'\\D'
>>> re.findall(r,'djajdla')
['d', 'j', 'a', 'j', 'd', 'l', 'a']
>>> re.findall(r,'4141')
[]
>>> re.findall(r,'**&^*&%')
['*', '*', '&', '^', '*', '&', '%']
>>>
\s 匹配任何空白字符:它相当于类 [\t\n\r\f\v]。规则是匹配任何空格,一个空格返回一个逗号。
>>> r = r"\s"
>>> re.findall(r,'**&^*&%')
[]
>>> re.findall(r,' ')
[' ', ' ', ' ', ' ', ' ', ' ']
>>> re.findall(r,' ')
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
>>>
\S 匹配任何非空白字符:它相当于类 [^\t\n\r\f\v]。规则是匹配任何除了空格的任何字母数字和符号。
>>> r = r"\S"
>>> re.findall(r,' ')
[]
>>> re.findall(r,'213kkddDWQD……&*%¥%')
['2', '1', '3', 'k', 'k', 'd', 'd', 'D', 'W', 'Q', 'D', '\xe2', '\x80', '\xa6', '\xe2', '\x80', '\xa6', '&', '*', '%', '\xef', '\xbf', '\xa5', '%']
>>>
\w 匹配任何字母数字字符:它相当于类 [a-zA-Z0-9_]。规则是匹配键盘上除了符号的任意字符,包括空格。
>>> r = r"\w"
>>> re.findall(r,'213kkddDWQD90^#%&* dfs ')
['2', '1', '3', 'k', 'k', 'd', 'd', 'D', 'W', 'Q', 'D', '9', '0', 'd', 'f', 's']
>>> re.findall(r,' 2 1 dD0^#%&* dfs ')
['2', '1', 'd', 'D', '0', 'd', 'f', 's']
>>>
\W 匹配任何非字母数字字符:它相当于类 [^a-zA-Z0-9_]。规则是匹配符号和空格,除了字母和数字以外。
>>> r = r"\W"
>>>
>>> re.findall(r,' 2 1 dD0^#%&* dfs ')
[' ', ' ', ' ', '^', '#', '%', '&', '*', ' ', ' ', ' ']
>>> re.findall(r,' %&^$#*((*&$$')
[' ', '%', '&', '^', '$', '#', '*', '(', '(', '*', '&', '$', '$']
>>> re.findall(r,' 2314dsfdsf')
[' ']
>>>
###########################################
重复元字符:
正则表达式第一功能是能够匹配不定长的字符集,另一个功能就是你可以指定正则表达式的一部分的重复次数。
*: 星号
指定前一个字符可以被匹配零次或更多次,而不是只有一次,匹配引擎会试着重复尽可能多的次数(不超过整数界定范围,20忆)
(a[bcd]*b -- "abcbd...")
#定义规则是开头是010的北京号码。 后面是八位任意的数字组合,如果不够八位就不符合我们的规则,返回空列表。(\d 八个就是八位数)
>>> r = r"^010-\d\d\d\d\d\d\d\d"
>>>
>>> re.findall(r,'010-23445567')
['010-23445567']
>>> re.findall(r,'010-2344556')
[]
>>>
################################################################
{}:花括号,可以定义重复的次数。
>>> r = r"^010-\d{8}" #规则是开头010-后面任何八位数字,相当于(\d重复八次)
>>> re.findall(r,'010-2344556')
[]
>>> re.findall(r,'010-23445567')
['010-23445567']
>>>
##############################################
*:星号,定义星号前一个字符可以重复零次、一次或数次
>>> r = r"ab*" #规则是重复b 零次或者更多次,可以肯本不出现
>>> re.findall(r,'a') #b 不出现也可以匹配
['a']
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abbbbbbb')
['abbbbbbb']
>>> re.findall(r,'abbbbbbbabbf') #只会重复b ,b 后面跟的字符不对,就会另进入一组。
['abbbbbbb', 'abb']
>>> re.findall(r,'ababababababab')
['ab', 'ab', 'ab', 'ab', 'ab', 'ab', 'ab']
>>>
###############################################
+:加号
表示匹配一或更多次。
注意*和+之间的不同;*匹配零或更多次,所以可以根本就不出现,而+则需求至少出现一次。
>>> import re
>>>
>>>
>>> r = r"ab+" #规则是重复b 一次或多次,最起码要出现一次,来匹配表达式
>>>
>>> re.findall(r,'a') #未出现,则不匹配,返回空列表
[]
>>> re.findall(r,'ab')
['ab']
>>> re.findall(r,'abbbbb')
['abbbbb']
>>> re.findall(r,'ababababab')
['ab', 'ab', 'ab', 'ab', 'ab']
>>>
?:问号 , 前面的一个字符可有可无。
匹配一次或零次,你可以认为它用于标识某事物是可选的。
>>> r = r"^010-?\d{8}$" #规则是匹配开头是010,八位数字结尾的电话号码,?问号前面的- 可有可无。
>>>
>>> re.findall(r,'010-12345678')
['010-12345678']
>>> re.findall(r,'01012345678')
['01012345678']
>>> r = r"^010?-\d{8}$" #规则是匹配开头是010,八位数字结尾的电话号码,?问号前面的 0 可有可无。
>>> re.findall(r,'010-12345678')
['010-12345678']
>>> re.findall(r,'01-12345678')
['01-12345678']
>>> re.findall(r,'0-12345678')
[]
>>>
################################################
贪婪模式和非贪婪模式。。。。
>>> xiaoming = r"ab+" #重复b 一次或多次。
>>>
>>> re.findall(xiaoming,'abbbbbbbbbbbbbbbbb') #贪婪模式
['abbbbbbbbbbbbbbbbb']
>>> xiaoming = r"ab+?" #规则是重复b一次或多次,?但是+可有可无,最后取ab 非贪婪模式一次。
>>> re.findall(xiaoming,'abbbbbbbbbbbbbbbbb')
['ab']
>>>
################################################
{} :花括号。 {m,n}
其中m和n是十进制整数,该限定符的意思是至少有m个重复,最多到n个重复。
>>> xiaoming = r"a{0,4}" #规则为重复a零次到4次,多或者少都会认为不匹配。
>>> re.findall(xiaoming,'') #0次
[' ']
>>> r = r"a{1,4}"
>>> re.findall(r,'') #至少一次,不匹配返回空列表。
[]
>>>
#######################################
>>> re.findall(xiaoming,'a')
['a', '']
>>> re.findall(xiaoming,'aa')
['aa', '']
>>> re.findall(xiaoming,'aaa')
['aaa', '']
>>> re.findall(xiaoming,'aaaa')
['aaaa', '']
>>> re.findall(xiaoming,'aaaaa')
['aaaa', 'a', '']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment