美文网首页
Python3.x 正则基础学习

Python3.x 正则基础学习

作者: Bruce_XHG | 来源:发表于2019-12-25 14:44 被阅读0次

    使用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)
    
    

    相关文章

      网友评论

          本文标题:Python3.x 正则基础学习

          本文链接:https://www.haomeiwen.com/subject/ebzqoctx.html