使用Python正则,首先得导入re文件
import re
虽然开发了几年但是并没有怎么研究过正则的使用,学习Python的时候让我觉得正则是如此的强大,然而正则表达式是可以通用的,也就是说虽然我我是在Python中学正则表达式,但是在OC、swift、Android、Java、js等各种语言中都可以使用的一种通用知识点,所以还是掌握的比较好。
正则的使用可以说可以很快速优雅的处理你想处理的字符串问题,但是有些处理系统也提供了方法,如果是系统提供的建议还是使用系统提供的方法。
1、找出字符串中指定的字符
# 找出字符串中的python
a = 'java|oc|c|c++|python|php|html|css|go|javascript|'
1、我们可以使用in
print('python' in a) # 返回结果是 True
2、我们可以使用index方法,但是此方法不建议使用。因为如果不存在程序就会crash
print(a.index('python')) # 返回结果是python在字符串中的其实位置的index
3、我们使用正则进行匹配
print('通过正则在字符串中找到符合条件的子字符串:', re.findall('python', a)) # 返回结果是 ['python']
2、找出字符串中某一类字符
b = 'java1oc2c3c++4python5php6html7css8go9javascript0' # 找出字符串中的数字
1、找出字符串中的所有数字
print(re.findall('\d', b)) # 结果是:['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
2、找出字符串中所有的非数字字符
print(re.findall('\D', b)) # 结果是:['j', 'a', 'v', 'a', 'o', 'c', 'c', 'c', '+', '+', 'p', 'y', 't', 'h', 'o', 'n', 'p', 'h', 'p', 'h', 't', 'm', 'l', 'c', 's', 's', 'g', 'o', 'j', 'a', 'v', 'a', 's', 'c', 'r', 'i', 'p', 't']
3、使用正则把字符串中的数字替换成 |
print(re.sub(re.compile('\d'), '|', b)) # 结果是:java|oc|c|c++|python|php|html|css|go|javascript|
4、使用正则找到字符串中所有的数字并进行排序
print(sorted(re.findall('\d', b))) # 结果是:['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
上面排序使用到了sort函数;字符串替换sub函数
3、简单说说match、search、findall函数
1、match:只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;并且match只匹配一次
例如:
print('[^]:', re.match("[^0-9]+", 'wscvf123')) # [^]: <re.Match object; span=(0, 5), match='wscvf'>
print('\d:', re.match('[0-9]+', 'wscvf123')) # \d: None 因为字符串开始不是以数字开始所以匹配失败
print('[^0-9]+', re.match('[^0-9]+', 'dhjsw3432jda13rjsr59dj78')) # [^0-9]+ <re.Match object; span=(0, 5), match='dhjsw'> 只匹配了一次
2、search: 匹配整个字符串,直到找到一个匹配
例如:
print('\d+:', re.search('\d+', 'wscvf123')) # \d+: <re.Match object; span=(5, 8), match='123'>
print('[0-9]+', re.search('[0-9]+', 'dhjsw3432jda13rjsr59dj78')) # [0-9]+ <re.Match object; span=(5, 9),match='3432'> 只匹配了一次
3、findall匹配所有符合正则表达式的字符
例如:
print('[0-9]+', re.findall('[0-9]', 'dhjsw3432jda13rjsr59dj78')) # [0-9]+ ['3', '4', '3', '2', '1', '3', '5', '9', '7', '8']
4、正则表达式常用的元字符(multiline 是一个布尔对象,如果使用了 "m" 标志,则返回true;否则,返回false。"m" 标志意味着一个多行输入字符串被看作多行。例如,使用 "m","^" 和 "$" 将会从只匹配正则字符串的开头或结尾,变为匹配字符串中任一行的开头或结尾。)
元字符 | 解释 |
---|---|
------------------------------------------------------------------------------ | |
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\' 匹配 "" 而 "(" 则匹配 "("。 |
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。注意:如果[^0-9]则表示非数字
|
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 |
. | 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.或\n)"的模式。 |
x或y | 匹配 x 或 y。例如,'z或food' 能匹配 "z" 或 "food"。'(z或f)ood' 则匹配 "zood" 或 "food"。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
\w | 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。 |
\W | 匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。 |
\num | 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 |
1、\
print("\\n:", re.search('\n', """这是一段换行的匹配
这是一段换行的匹配
这是一段换行的匹配
""")) # \n: <re.Match object; span=(9, 10), match='\n'>
2、^ [^] {n,m}
re_root = '^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$'
print('[^0-9]+', re.match('[^0-9]+', 'dhjsw3432jda13rjsr59dj78')) # [^0-9]+ <re.Match object; span=(0, 5), match='dhjsw'>
3、$ \S
print('\S+$:', re.match('\S+$', 'wscvf123')) # \S+$: <re.Match object; span=(0, 8), match='wscvf123'>
4、+ \D
print('\D+:', re.match('\D+', 'wscvf123')) # \D+: <re.Match object; span=(0, 5), match='wscvf'>
5、?
print('?:', re.match('ws(cv)?', 'wscvf123')) # ?: <re.Match object; span=(0, 4), match='wscv'>
6、| {n}
res = re.match('(13[0-9]|14[1|5|6|7|9]|15[0-3,5-9]|16[6-8]|17[0-8]|18[0-9]|19[89])\d{8}', phoneNumber)
网友评论