本文主要介绍Python正则表达式中的元字符的使用,元字符也就是
\ ^ $ * + . | ? {} [] ()
这些字符.
RE模块
Python中的正则表达式是通过re模块来使用的.所以在使用正则表达式的时候需要先import re
导入re模块.
re.match()
re.match尝试从字符串的开始匹配.re.match的函数模型为:re.match(pattern, string, flags)
,
第一个参数是是正则表达式;第二个参数是被匹配的字符串;第三个参数是标识位,用来控制匹配方式,比如大小写的区分等.
使用re.match匹配从头开始匹配,如果匹配成功则返回一个match,否则返回none.
re.search()
re.search在整个字符串中进行查找,如果找到第一个就开始返回,然后不会在进行继续匹配.如果没有找到则返回none.re.search的函数模型跟re.match是一样的,他们唯一的区别就是match会一直进行匹配知道字符串结尾,而re.search一旦查找匹配到一个就会停止查找匹配,直接返回查找到的第一个.
re.findall()
re.findall可以获取字符串中所有匹配的字符串.
re.sub()
re.sub是用于替换字符串,它的函数模型是re.sub(parrern, replace, string, flags),除了第二个参数是替换的字符串之外其他的参数都同re.match()
re.compile()
re.compile()是将正则表达式的字符串编译成一个正则表达式对象.
matchObject的属性
在匹配得到的matchObject对象中有几个常用属性.
group()用于返回被re匹配的字符串,他可以传递参数来取得匹配完成之后的列表的某一个元素.
start() 返回匹配的开始位置
end() 返回匹配的结束位置
span() 返回一个包含匹配的开始和结束位置的元组.
\
\反斜杠后面可以加不同的字符以表示特殊意义。 也可用于取消所有元字符,变为普通符号。
\d 匹配任何十进制数:相当于[0-9]
\D 匹配任何非数字字符:相当于 [^0-9]
\s 匹配任何空白字符:相当于 [\t\n\r\f\v]
\S 匹配任何非空白字符:相当于 [^\t\n\r\f\v]
\w 匹配任何字母数字下划线字符:相当于[a-zA-Z0-9_]
\W 匹配任何非字母数字下划线字符:相当于[^a-zA-Z0-9_]
例如:
>>> import re
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbr'
>>> pattern1 = re.compile(r'\d')
>>> print(re.findall(pattern1, key))
['6', '7', '5', '8', '2', '4', '1', '2', '3', '1', '2', '3', '4']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbr'
>>> pattern1 = re.compile(r'\D')
>>> print(re.findall(pattern1, key))
['a', 's', 'd', 'h', 'f', 'l', 'a', 's', 'd', 'h', 'j', 'k', 'l', 'o', 'h', 'j', 'k', 'w', 'a', 's', 'b', 'd', 'f', 'w', 'o', 'v', 'h', 'j', ',', 'v', 'h', 'w', 'j', 'b', 'r']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'\s')
>>> print(re.findall(pattern1, key))
[' ', ' ', ' ', ' ']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'\W')
>>> print(re.findall(pattern1, key))
[',', ' ', ' ', ' ', ' ']
^
^ 表示字符串的开头.从开头位置匹配字符串.匹配成功返回匹配的字符串,失败则返回空.但是他在[]内部则表示取反.
例如:
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'^asd')
>>> print(re.findall(pattern1, key))
['asd']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'^asg')
>>> print(re.findall(pattern1, key))
[]
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'[^a-z]')
>>> print(re.findall(pattern1, key))
['6', '7', '5', '8', '2', '4', '1', '2', '3', ',', '1', '2', '3', '4', ' ', ' ', ' ', ' ']
$
$ 表示匹配字符串的末尾,在多行情况下换行\n也是末尾,即每一行都是字符串的末尾.
*
* 指定前一个字符可以匹配0次或者多次,而不是只有1次,匹配结果会尽可能的重复多次最大不超过20亿次.(后面若加?变为非贪婪模式仅匹配0次)
例如:
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'asd*')
>>> print(re.findall(pattern1, key))
['asd', 'asd', 'as']
+
- 匹配前一个字符1次或者多次.(后面若加问号?变为非贪婪模式仅匹配1次)
例如:
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'asd+')
>>> print(re.findall(pattern1, key))
['asd', 'asd']
.
. 能匹配任意一个字符,若需要匹配 . 本身需要使用 \ 做转义.
例如:
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'^.+?$')
>>> print(re.findall(pattern1, key))
['asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg ']
|
| 代表左右表达式任意匹配一个.比如:a|b 匹配a或者匹配b. 如果有一个表达式不成立则匹配成立的那个.
例如:
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'^.+?$|[^\d]')
>>> print(re.findall(pattern1, key))
['asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg ']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'[^\d]|^.+?$') >>> print(re.findall(pattern1, key))
['a', 's', 'd', 'h', 'f', 'l', 'a', 's', 'd', 'h', 'j', 'k', 'l', 'o', 'h', 'j', 'k', 'w', 'a', 's', 'b', 'd', 'f', 'w', 'o', 'v', 'h', 'j', ',', 'v', 'h', 'w', 'j', 'b', 'r', 's', ' ', 's', 'h', 'd', 'k', 'f', ' ', ' ', 'h', 's', 'k', 'l', 'j', 'h', 'd', 'f', 'g', ' ']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'a|b')
>>> print(re.findall(pattern1, key))
['a', 'a', 'a', 'b', 'b']
?
?匹配前一个字符0次或者1次.(后面若加?变为非贪婪模式仅匹配0次.)?可以使python原本的贪婪模式变为非贪婪模式.
{}
{m} m是数字,表示重复前一个字符m次.
{m,n} 表示重复前一个字符m-n次.若省略m则表示0-n次,若省略n表示m到无限次.(后面若加?变为非贪婪模式仅匹配0次:ab{2,100}?结果为abb)
例如:
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'[a-z]{2}')
>>> print(re.findall(pattern1, key))
['as', 'dh', 'fl', 'as', 'dh', 'jk', 'oh', 'jk', 'wa', 'sb', 'df', 'vh', 'vh', 'wj', 'br', 'sh', 'dk', 'hs', 'kl', 'jh', 'df']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'[a-z]{2,4}')
>>> print(re.findall(pattern1, key))
['asdh', 'flas', 'dhjk', 'ohjk', 'wasb', 'df', 'vhj', 'vhwj', 'brs', 'shdk', 'hskl', 'jhdf']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'[a-z]{,4}')
>>> print(re.findall(pattern1, key))
['asdh', 'flas', 'dhjk', 'l', '', '', '', '', 'ohjk', 'wasb', 'df', '', 'w', '', '', '', 'o', '', 'vhj', '', '', '', '', '', 'vhwj', 'brs', '', 'shdk', 'f', '', '', 'hskl', 'jhdf', 'g', '', '']
>>> key = 'asdhflasdhjkl6758ohjkwasbdf2w412o3vhj,1234vhwjbrs shdkf hskljhdfg '
>>> pattern1 = re.compile(r'[a-z]{0,}')
>>> print(re.findall(pattern1, key))
['asdhflasdhjkl', '', '', '', '', 'ohjkwasbdf', '', 'w', '', '', '', 'o', '', 'vhj', '', '', '', '', '', 'vhwjbrs', '', 'shdkf', '', '', 'hskljhdfg', '', '']
[]
[]常用来指定一个字符集,如:[a-z],这里面所有的字母会被一一匹配.上述表达式中常用,例子可以查看上述...
()
(...)将正则表达式分组,每个分组为一个整体,将优先返回分组内的数据.
网友评论