Python正则处理CSS选择器及简便匹配提取组的技术问询
我来帮你解决这两个正则相关的问题:
问题1:提取CSS选择器中的ID和类选择器
要从复杂CSS选择器列表里提取#(ID选择器)和.(类选择器),核心是精准匹配这两种选择器的格式——ID是#后跟合法标识符(字母、数字、下划线、连字符),类是.后跟同样的标识符,同时要注意过滤掉属性选择器(比如[href="#top"])里的特殊字符。
实现代码
import re # 示例CSS选择器列表 css_selectors = [ "#header .nav-item", "div#content.main-container", "a[href='#top'] .link-active", ".sidebar #secondary-menu" ] # 正则模式:匹配不在引号/方括号内的ID和类选择器 # 负向断言确保#/.不是属性里的内容 id_pattern = re.compile(r'(?<![\["])#[\w-]+') class_pattern = re.compile(r'(?<![\["])\.[\w-]+') extracted_ids = [] extracted_classes = [] for selector in css_selectors: # 批量提取当前选择器中的所有ID和类 extracted_ids.extend(id_pattern.findall(selector)) extracted_classes.extend(class_pattern.findall(selector)) # 可选:去重处理 extracted_ids = list(set(extracted_ids)) extracted_classes = list(set(extracted_classes)) print("提取的ID选择器:", extracted_ids) print("提取的类选择器:", extracted_classes)
说明
(?<![\["])是负向零宽断言,确保#或.前面不是[或",避免把属性选择器里的#top这类内容误判为ID选择器。[\w-]+匹配所有合法的CSS标识符(CSS允许ID/类名包含字母、数字、下划线、连字符)。- 用
findall可以一次性提取当前选择器中的所有目标,比逐次search更高效。
问题2:高效提取文件中所有引号内的内容
你的当前实现可以优化,主要从减少IO操作和降低正则调用次数两个方向入手:
优化后的实现
import re # 一次性读取整个文件内容(比readlines逐行处理更高效,减少IO开销) with open('your_file.txt', 'r', encoding='utf-8') as f: file_content = f.read() # 匹配所有双引号内的内容: # 如果你不需要处理转义引号(比如"he said \"hello\""),用r'"(.*?)"'即可 # 要支持转义引号的话,用r'"(?:\\.|[^"])*"' quote_pattern = re.compile(r'"(.*?)"') # findall直接返回所有分组内容的列表,无需循环判断 extracted_quotes = quote_pattern.findall(file_content) print(extracted_quotes)
为什么更高效?
- 一次性读取文件:
read()比readlines()减少了多次IO交互的开销,尤其是处理大文件时优势明显。 - 单次正则扫描:
findall会一次性扫描整个文件内容,找出所有匹配项,比逐行调用search减少了正则引擎的重复初始化和扫描次数。 - 避免重复调用:你的原代码里每行都调用了两次
re.search(先判断再取值),优化后直接用findall一步到位,代码更简洁。
特殊情况处理
如果你的文件里存在转义双引号(比如"message: \"hello world\""),需要把正则改成:
quote_pattern = re.compile(r'"(?:\\.|[^"])*"')
这个模式会跳过转义的引号,正确提取包含转义字符的字符串内容。
内容的提问来源于stack exchange,提问作者lgjmac
相关产品推荐
相关产品推荐

