Python中如何编写正则表达式来解析标记语言?

import re

regex = re.compile(r’(^| )=([^\s][^\s])=(\B|[\u4e00-\u9fa5])’) text = '=1= = 2= =3 == = 4 = =5=, =6= =7=三 =8=a =9==’

print(regex.findall(text))

需求: 两个等号之间不能以空格开头或结尾,第一个等号之前只能是空格或者每一行的开始位置,第二个等号之后可以是标点或者汉字或者每一行结束,不能是数字字母下划线

想问一下为什么匹配不到 3 =

期望输出

[('', '1', ''),(' ','3 =','') (' ', '5', ''), (' ', '6', ''), (' ', '7', '三'), (' ', '9=', '')]

实际输出

[('', '1', ''), (' ', '5', ''), (' ', '6', ''), (' ', '7', '三'), (' ', '9=', '')]

请教一下这该怎么修改?


Python中如何编写正则表达式来解析标记语言?

8 回复

2010 年我认真的学习了正则表达式,各种高级特性,复杂字符串解析,但现在发现没什么用处
工作中的数据处理都是以 json 交互,自定义要输出的数据格式

第二个括号了没包括空格,尝试了两下没成功,不打算浪费时间了
我觉得楼主还是看看怎么折腾下数据来源吧


import re

# 基础HTML标签解析
def parse_basic_tags(html):
    # 匹配开始标签、内容和结束标签
    pattern = r'<(\w+)>(.*?)</\1>'
    return re.findall(pattern, html, re.DOTALL)

# 带属性的标签解析
def parse_tags_with_attrs(html):
    # 匹配标签名、属性和内容
    pattern = r'<(\w+)([^>]*)>(.*?)</\1>'
    matches = re.findall(pattern, html, re.DOTALL)
    
    results = []
    for tag, attrs, content in matches:
        # 解析属性
        attr_dict = {}
        attr_pattern = r'(\w+)="([^"]*)"'
        for name, value in re.findall(attr_pattern, attrs):
            attr_dict[name] = value
        
        results.append({
            'tag': tag,
            'attrs': attr_dict,
            'content': content.strip()
        })
    return results

# 自闭合标签解析
def parse_self_closing_tags(html):
    pattern = r'<(\w+)([^>]*)/>'
    matches = re.findall(pattern, html)
    
    results = []
    for tag, attrs in matches:
        attr_dict = {}
        attr_pattern = r'(\w+)="([^"]*)"'
        for name, value in re.findall(attr_pattern, attrs):
            attr_dict[name] = value
        
        results.append({
            'tag': tag,
            'attrs': attr_dict,
            'self_closing': True
        })
    return results

# 使用示例
if __name__ == "__main__":
    # 测试HTML
    test_html = '''
    <div class="container">
        <h1>标题</h1>
        <p id="main">这是一个段落</p>
        <img src="image.jpg" alt="图片"/>
        <a href="https://example.com">链接</a>
    </div>
    '''
    
    print("基础标签解析:")
    print(parse_basic_tags(test_html))
    
    print("\n带属性标签解析:")
    for item in parse_tags_with_attrs(test_html):
        print(item)
    
    print("\n自闭合标签解析:")
    print(parse_self_closing_tags(test_html))

正则表达式解析标记语言的关键点:

  1. 标签匹配<(\w+)> 匹配标签名,</\1> 匹配对应的结束标签
  2. 属性解析(\w+)="([^"]*)" 匹配属性名和值
  3. 非贪婪匹配:使用 .*? 避免匹配过多内容
  4. re.DOTALL标志:让 . 匹配换行符,处理多行内容

对于复杂标记语言建议用专门的解析库。

匹配不到‘ 3 =’是因为([^\s]*[^\s])里面不能包含空格
尝试了几下, 把‘ 3 =’包括进来,但是不满足最后一个
我的表达式是regex = re.compile(r'(^| )=(\S(?:\S*|.*?\S))=(\B|[\u4e00-\u9fa5])')
输出是[('', '1', ''), (' ', '3 =', ''), (' ', '5', ''), (' ', '6', ''), (' ', '7', '三'), (' ', '8=a =9', '')]

上 pyparsing 吧

正则表达式其实挺有用的,就是得注意啥时候该用啥时候不该用

数据源就是这样,想要解析标记语言

Thank you,我再试试

多谢提醒

中间的部分改成这样:
([^\s]|[^\s]+.?[^\s]+)

Thank you.

回到顶部