设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 14207|回复: 3
打印 上一主题 下一主题

正则表达式问题

[复制链接]

3

主题

0

好友

37

积分

新手上路

Rank: 1

跳转到指定楼层
#
发表于 2018-7-24 20:02:25 |只看该作者 |正序浏览
import re
text = "<b>aasdadbd</b>"
m = re.findall(r"(?<=<(?<a>\w+)>).*(?=<(\/\k<a>>)",text)
if m:
    print (m)
else:
    print ('not match')

代码想要匹配的是在一对<tag></tag>之间的内容,但是发现有两个问题:
1. (?<=<(?<a>\w+)>)
这里报错提示lookbehind中不能用 + 重复,且命名组不可用。

2. m = re.findall(r"(?<=<(\w)>).*(?=<(\/\1))",text)
我把表达式的条件收窄之后,输出的只有尖括号里的内容(输出了[('b', '/b')]),貌似是因为我把尖括号里的表达式括起来了,所以优先匹配了括号里的内容?如果要正确显示结果应该怎么做?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2018-7-26 18:40:48 |只看该作者
cczztt 发表于 2018-7-25 17:00
的确你给的这个是可以用的,但是在多重tag嵌套的text里可能就不能正确匹配了。。。

import re

这是分组的效果,你不用它就好了呀
或者你用 search + group 的方法
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

0

好友

37

积分

新手上路

Rank: 1

沙发
发表于 2018-7-25 17:00:09 |只看该作者
crossin先生 发表于 2018-7-25 15:36
你这个太复杂以至于我也没看懂……
为啥不直接 ([\s\S]*?)


的确你给的这个是可以用的,但是在多重tag嵌套的text里可能就不能正确匹配了。。。

import re
text = "<b>aasdadbd</b>"
m = re.findall(r"<(\w+)>([\s\S]*?)</\1>",text)
if m:
    print (m)
else:
    print ('not match')
我把结束tag的表达式改成了</\1>来表示需要和开始tag成对才能匹配,但是输出结果里又多出来了一个 b 。。。

C:\Users\Administrator\PycharmProjects\First_test\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/First_test/1.py
[('b', 'aasdadbd')]

Process finished with exit code 0

这个小括号括了的内容不想他输出该怎么办呢?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

楼主
发表于 2018-7-25 15:36:43 |只看该作者
你这个太复杂以至于我也没看懂……
为啥不直接 <\w+>([\s\S]*?)</\w+>
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-25 16:31 , Processed in 0.015697 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部