正则

作者: hehehehe | 来源:发表于2020-12-20 16:18 被阅读0次

    https://www.cnblogs.com/yjh-bl/p/11096594.html
    https://zhuanlan.zhihu.com/p/127807805
    https://docs.python.org/zh-cn/3/library/re.html

    [] () {}

    圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理
        (\s*)表示连续空格的字符串
        (abc|bcd|cde),表示这一段是abc、bcd、cde三者之一,顺序也必须一致
    方括号是单个匹配 字符集/排除字符集/命名字符集
        [\s*] 表示空格或者*号
    \s{1,3}表示匹配1到3个空格
    (0-9)匹配'0-9'本身。[0-9]*匹配数字
    
    p = re.compile(r'[0-9][^x|y]')
    re.search(p,'3xt')
    new_address = re.sub('(号|弄|栋|幢|号楼|附近)$', '', address)
    
    time_pattern = re.compile(r'[(](.*?)[)]', re.S)
    time_h_pattern = re.compile(r'h(\d*)', re.S)
    time_m_pattern = re.compile(r'm(\d*)', re.S)
    
    import re
    import json
    
    pre = 'recall_data_gd='
    suffix = ' where'
    re_compile = re.compile(f"{pre}'(.*?)'{suffix}")
    
    if __name__ == '__main__':
        with open("/Users/shilulu/Downloads/update_gz_0.sql", "r") as f:
            with open("/Users/shilulu/Downloads/update_gz_0_0.sql", "w") as f2:
                while True:
                    l = f.readline()
                    if l:
                        ll = re.findall(re_compile, l)
                        s = ll[0]
                        replaced = s.replace("'", "''")
                        l_replace = re.sub(re_compile, pre + "'" + replaced + "'" + suffix, l)
                        f2.write(l_replace)
                    else:
                        break
    
    
    1.查找一个匹配项

    查找并返回一个匹配项(Match)的函数有3个:search、match、fullmatch,他们的区别分别是:
    search: 查找任意位置的匹配项
    match: 必须从字符串开头匹配
    fullmatch: 整个字符串与正则完全匹配

    2.查找多个匹配项

    现在来看看查找多项,查找多项函数主要有:findall函数 与 finditer函数:
    findall: 从字符串任意位置查找,返回一个列表
    finditer:从字符串任意位置查找,返回一个迭代器

    3.分割

    re.split(pattern, string, maxsplit=0, flags=0) 函数:用 pattern 分开 string , maxsplit表示最多进行分割次数, flags表示模式,就是上面我们讲解的常量!

    4.替换

    re.sub(pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。

    值得注意的是:sub函数中的入参:repl替换内容既可以是字符串,也可以是一个函数哦! 如果repl为函数时,只能有一个入参:Match匹配对象。

    数量

    多字符匹配(表示数量)

    *   匹配前一个字符出现0次或者无限次,即可有可无
    +   匹配前一个字符出现1次或者无限次,即至少1次
    ?   匹配前一个字符出现1次或者0次,即至多1次
    {m} 匹配前一个字符出现m次
    {m,}    匹配前一个字符至少出现m次
    {m,n}   匹配前一个字符出现从m到n次
    

    单字符匹配(表示字符)

    字符  功能
    .   匹配任意1个字符(除了\n)
    []  匹配[]中列举的字符
    \d  匹配数字,即0-9
    \D  匹配非数字,即不是数字
    \s  匹配空白,即空格,tab键 ,\n
    \S  匹配非空白
    \w  匹配单词字符,即a-z  A-Z  0-9   _
    \W  匹配非单词字符
    
    
    \d == [0-9]
    \D == [^0-9]
    \w == [a-zA-Z0-9_]
    \W == [^a-zA-Z0-9_]
    

    表示边界

    字符  功能
    ^   匹配字符串开头
    $   匹配字符串结尾
    \b  匹配一个单词的边界
    \B  匹配非单词边界
    ^ 和 $ 是描述整个字符串的边界
    \b 和 \B 是描述字符串中的单词边界
    
    正则表达式   规则  可以匹配
    ^   开头  字符串开头
    $   结尾  字符串结束
    [ABC]   […]内任意字符    A,B,C
    [A-F0-9xy]  指定范围的字符 A,……,F,0,……,9,x,y
    [^A-F]  指定范围外的任意字符  非A~F
    AB|CD|EF    AB或CD或EF    AB,CD,EF
    
    image.png

    非贪婪匹配

    public class Main {
        public static void main(String[] args) {
            Pattern pattern = Pattern.compile("(\\d+?)(0*)");
            Matcher matcher = pattern.matcher("1230000");
            if (matcher.matches()) {
                System.out.println("group1=" + matcher.group(1)); // "123"
                System.out.println("group2=" + matcher.group(2)); // "0000"
            }
        }
    }
    
    • 修饰符可以匹配任意个字符,包括0个字符。我们用A\d可以匹配:

    A:因为\d可以匹配0个数字;
    A0:因为\d
    可以匹配1个数字0;
    A380:因为\d*可以匹配多个数字380。
    修饰符+可以匹配至少一个字符。我们用A\d+可以匹配:

    A0:因为\d+可以匹配1个数字0;
    A380:因为\d+可以匹配多个数字380。
    但它无法匹配"A",因为修饰符+要求至少一个字符。

    • 修饰符?可以匹配0个或一个字符。我们用A\d?可以匹配:

    A:因为\d?可以匹配0个数字;
    A0:因为\d+可以匹配1个数字0。
    但它无法匹配"A33",因为修饰符?超过1个字符就不能匹配了。

    • 如果我们想精确指定n个字符怎么办?用修饰符{n}就可以。A\d{3}可以精确匹配:

    A380:因为\d{3}可以匹配3个数字380。

    • 如果我们想指定匹配n~m个字符怎么办?用修饰符{n,m}就可以。A\d{3,5}可以精确匹配:

    A380:因为\d{3,5}可以匹配3个数字380;
    A3800:因为\d{3,5}可以匹配4个数字3800;
    A38000:因为\d{3,5}可以匹配5个数字38000。

    • 如果没有上限,那么修饰符{n,}就可以匹配至少n个字符。

    相关文章

      网友评论

          本文标题:正则

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