Featured image of post 正则表达式

正则表达式

re模块

在python程序中使用正则呢需要借助re模块

  1. findall 查找所有. 返回list

    1
    2
    3
    4
    
    lst = re.findall("m", "mai le fo len, mai ni mei!") 
    print(lst)    # ['m', 'm', 'm'] 
    lst = re.findall(r"\d+", "5点之前. 你要给我5000万")
    print(lst)   # ['5', '5000']
    
  2. search 会进行匹配. 但是如果匹配到了第一个结果. 就会返回这个结果. 如果匹配不上search返回的则是None

    1
    2
    
    ret = re.search(r'\d', '5点之前. 你要给我5000万').group()
    print(ret) # 5
    
  3. match 只能从字符串的开头进行匹配

    1
    2
    
    ret = re.match('a', 'abc').group()  
    print(ret)     # a
    
  4. finditer 和findall差不多. 只不过这时返回的是迭代器(重点)

    1
    2
    3
    
    it = re.finditer("m", "mai le fo len, mai ni mei!")
    for el in it:
        print(el.group()) # 依然需要分组
    
  5. compile() 可以将一个长长的正则进行预加载. 方便后面的使用

    1
    2
    3
    
    obj = re.compile(r'\d{3}')  # 将正则表达式编译成为一个 正则表达式对象, 规则要匹配的是3个数字
    ret = obj.search('abc123eeee') # 正则表达式对象调用search, 参数为待匹配的字符串
    print(ret.group())  # 结果: 123
    
  6. 正则中的内容如何单独提取?

    单独获取到正则中的具体内容可以给分组起名字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    s = """
    <div class='西游记'><span id='10010'>中国联通</span></div>
    """
    obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>\w+)</span>", re.S)
    
    result = obj.search(s)
    print(result.group())  # 结果: <span id='10010'>中国联通</span>
    print(result.group("id"))  # 结果: 10010 # 获取id组的内容
    print(result.group("name"))  # 结果: 中国联通 # 获取name组的内容
    

    在正则表达式中,?P是一个命名捕获组的语法,它用于给捕获组命名,以便于之后可以通过名字来引用匹配到的文本。这里的各个部分含义如下:

    ?P:这是命名捕获组的开始标记,告诉正则表达式解析器接下来的内容是一个命名捕获组。

    :这是捕获组的名称,你可以自定义一个有意义的名字。这个名字在匹配后的操作中用来引用这个捕获组匹配到的文本。

    使用命名捕获组的好处是,代码可读性更强,也更容易理解每个捕获组的作用,特别是在处理复杂的正则表达式时。在Python的re模块中,一旦命名捕获组匹配成功,你可以使用group()方法并传入捕获组的名字来获取相应的匹配文本。

  7. 正则表达式本身是用来提取字符串中的内容的. 也可以用作字符串的替换

    1
    2
    3
    4
    5
    6
    
    import re
    r = re.split(r"\d+", "我今年19岁了, 你知道么, 19岁就已经很大了. 周杰伦20岁就得奖了")
    print(r)  # ['我今年', '岁了, 你知道么, ', '岁就已经很大了. 周杰伦', '岁就得奖了']
    # 替换
    r = re.sub(r"\d+", "18", "我今年19岁了, 你知道么, 19岁就已经很大了. 周杰伦20岁就得奖了")
    print(r)  # 我今年18岁了, 你知道么, 18岁就已经很大了. 周杰伦18岁就得奖了
    

​ 哦了. 正则. 这些东西够用了.

Licensed under CC BY-NC-SA 4.0
Good Morning, and in case I don't see you, good afternoon, good evening, and good night!
使用 Hugo 构建
主题 StackJimmy 设计