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中如何编写正则表达式来解析标记语言?
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))
正则表达式解析标记语言的关键点:
- 标签匹配:
<(\w+)>匹配标签名,</\1>匹配对应的结束标签 - 属性解析:
(\w+)="([^"]*)"匹配属性名和值 - 非贪婪匹配:使用
.*?避免匹配过多内容 - 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.

