python正则表示式学习笔记(一)

今日遇到的问题

  • r'(user:|assistant:)(.*?)(?=user:|assistant:|$)'
    • (.*?)
      • 这是一个非贪婪匹配的分组,用于匹配发言者之后的文本内容,直到遇到下一个发言者或者达到字符串结尾
    • .*?
      • .表示匹配任意字符(除了换行符)
      • *表示匹配前面的任意字符零次或多次
      • ?使匹配变为非贪婪模式,即尽可能少地匹配字符,直到遇到下一个发言者标识或字符串结束
    • (?=user:|assistant:|$)
      • 这是一个正向前瞻断言,用于确保在匹配到发言者内容之后,下一个字符序列应该是"user:"或"assistant:"或者字符串结尾$
      • 正向前瞻不会消耗字符,只是进行检查。也就是说,它不会将匹配到的内容包含在最终的匹配结果中,但它会影响匹配的成功与否。
      • 这个前瞻断言确保了提取的内容是当前发言者的发言,而不是跨越发言者
  • 非贪婪匹配是指最短满足目标正则表达式的字符串
  • 贪婪匹配是指最长满足目标正则表达式的字符串
  • 正向前瞻断言的语法是(?=...),其中...是你想要匹配的模式(即正则表达式)
  • re.findall用于查找所有匹配正则表达式的子串,并返回一个包含所有匹配项的列表。如果正则表达式中有多个捕获组(即使用括号分组),则返回的列表中每个元素将是一个包含捕获组内容的元组。
  • re.search则用于查找字符串中第一次匹配正则表达式的位置,并返回一个匹配对象。如果没有找到匹配,则返回None。这个对象包含了匹配的详细信息,比如匹配的开始和结束位置,以及匹配的文本内容。如果需要获取整个匹配的内容,可以使用match.group()方法。
    import re
    
    text = "Hello, my email is example@example.com"
    pattern = r'(\w+@\w+\.\w+)'
    
    match = re.search(pattern, text)
    
    if match:
        print("找到匹配项:", match.group()) 
        print("开始位置:", match.start())
        print("结束位置:",match.end())
    else:
        print("未找到匹配项")
    
### Python 正则表达学习笔记 #### 1. 基本概念 正则表达种用于匹配字符串中字符模的强大工具。通过定义特定的语法结构,可以实现复杂的字符串搜索、替换等功能。 #### 2. 编译正则表达对象 为了提高效率,在多次使用同个模时应该先将其编译成正则表达对象。这可以通过 `re.compile()` 函数完成[^2]: ```python pattern = re.compile('www') matches = pattern.findall('www.baidu.www') # 结果为 ['www', 'www'] ``` #### 3. 使用特殊字符 某些字符具有特殊的含义,比如点号`.`表示任意单个字符(除换行符外)。如果想要匹配这些字符本身,则需要用反斜杠`\`来转义它们[^3]: ```python result = re.split(r'\.', "www.www.baidu.com") # 结果为 ['www', 'www', 'baidu', 'com'] ``` #### 4. 查找所有匹配项 函数 `findall()` 可以用来找到输入字符串中所有与给定模相匹配的部分,并返回个列表形的结果集: ```python text = 'www.baidu.www' regex = re.compile('www') found_items = regex.findall(text) # 返回 ['www', 'www'] ``` #### 5. 实际应用案例 - 网页抓取 下面是个简单的例子,展示了如何利用正则表达从HTML文档中提取所需的信息。这里的目标是从指定URL页面内获取章节标题并打印出来[^4]: ```python import re import requests url = "https://example.com" response = requests.get(url) html_content = response.content.decode("utf-8") chapter_list_html = re.findall( r'<ul class="chapter-list clearfix">.*?</ul>', html_content, flags=re.DOTALL)[0] titles = re.findall( r'<a.*?title="(.*?)".*?>', chapter_list_html) for title in titles: print(title) print(f"共爬取到 {len(titles)} 条记录") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值