免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 7641 | 回复: 31
打印 上一主题 下一主题

正则表达式问题 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-12 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-04-17 11:10 |只看该作者 |倒序浏览


我碰到如下的问题:

>>> line='11<root>22</root>33<root>44</root>6552';
>>> root_p = re.compile(r'<Root>(.*)?</Root>', re.IGNORECASE)
>>>
>>> searchobj=re.findall(root_p,line)
>>> for i in searchobj:
...     print(i)
...
22</root>33<root>44


我要提取<root>和</root>之间的数据,但从刚才跑的结果来看,pthon好像走了贪婪算法了。我要的数据应是:22,33

怎么才能得到我想要的结果呢? 谢谢大家!

论坛徽章:
0
2 [报告]
发表于 2018-04-17 11:24 |只看该作者
>>> line='11<root>22</root>33<root>44</root>6552'
>>> line
'11<root>22</root>33<root>44</root>6552'
>>> root_p = re.compile(r'<Root>(\d+)</Root>', re.IGNORECASE)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 're' is not defined
>>> import re
>>> root_p = re.compile(r'<Root>(\d+)</Root>', re.IGNORECASE)
>>> searchobj=re.findall(root_p,line)
>>> searchobj
['22', '44']
>>>

论坛徽章:
0
3 [报告]
发表于 2018-04-17 11:24 |只看该作者
22,33还是22,44?

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-12 06:20:00
4 [报告]
发表于 2018-04-17 11:32 |只看该作者
回复 2# dahe_1984

谢谢dahe_1984
我是把问题简化了。 其实<root>与</root>之间还有一大段数据,这些数据后面还得用正则去匹配。

<root>与</root>之间可以简单理解成为数据库中的一条记录。。

以前用perl这个都很好匹配的。。。。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-12 06:20:00
5 [报告]
发表于 2018-04-17 11:37 |只看该作者
dahe_1984 发表于 2018-04-17 11:24
22,33还是22,44?

不好意思,
应是22和44,

夹在<root>和</root>之间的数据。

这个问题的本质:开始字符窜分隔符与结束字符窜分隔符不一样,如何处理。

论坛徽章:
0
6 [报告]
发表于 2018-04-17 12:20 |只看该作者
51itpub 发表于 2018-04-17 11:37
不好意思,
应是22和44,

你把具体数据贴上来

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-12 06:20:00
7 [报告]
发表于 2018-04-17 13:44 |只看该作者
dahe_1984 发表于 2018-04-17 12:20
你把具体数据贴上来

Hi dahe_1984,
如下,原始数据:

20180210 10:10:45【队列自动】:10001<Root><Head><AA>QQ808311</AA><CommandCode>10001</CommandCode><Seq>201802101010431</Seq><VerifyCode></VerifyCode><BB>103</BB></Head><NoticeReq><CC>QQ808311_312020180210_802101008493712.s</CC><SeqtNo>802101008493712</SeqtNo><W5>3</W5><TotalNum>2</TotalNum><DD>687800</DD><W1>01</W1><AccType>1</AccType><W2>1</W2><W3><EncryptFlag>1</EncryptFlag><SourceDataMD5></SourceDataMD5><EncryptDD></EncryptDD></W3></NoticeReq></Root>20180210 10:10:46【队列自动】报文:10001<Root><NoticeResp><W4>通知受理成功</W4><ResultState>2</ResultState><ZZ>19000210000000044087</ZZ><ZA></ZA><SeqtNo>802101008493712</SeqtNo><CC>QQ808311_312020180210_802101008493712.s</CC></NoticeResp><Head><VerifyCode></VerifyCode><Seq>201802101010431</Seq><CommandCode>10001</CommandCode><AA>QQ808311</AA></Head></Root>20180210 10:10:46发送通知成功20180210 10:10:46成功标志文件已保存。20180210 10:10:46状态2更新成功。


这里有两段<root>(.*)<</root>的。




论坛徽章:
0
8 [报告]
发表于 2018-04-18 13:41 |只看该作者
import re
from bs4 import BeautifulSoup

string = '20180210 10:10:45【队列自动】:10001<Root><Head><AA>QQ808311</AA><CommandCode>10001</CommandCode><Seq>201802101010431</Seq><VerifyCode></VerifyCode><BB>103</BB></Head><NoticeReq><CC>QQ808311_312020180210_802101008493712.s</CC><SeqtNo>802101008493712</SeqtNo><W5>3</W5><TotalNum>2</TotalNum><DD>687800</DD><W1>01</W1><AccType>1</AccType><W2>1</W2><W3><EncryptFlag>1</EncryptFlag><SourceDataMD5></SourceDataMD5><EncryptDD></EncryptDD></W3></NoticeReq></Root>20180210 10:10:46【队列自动】报文:10001<Root><NoticeResp><W4>通知受理成功</W4><ResultState>2</ResultState><ZZ>19000210000000044087</ZZ><ZA></ZA><SeqtNo>802101008493712</SeqtNo><CC>QQ808311_312020180210_802101008493712.s</CC></NoticeResp><Head><VerifyCode></VerifyCode><Seq>201802101010431</Seq><CommandCode>10001</CommandCode><AA>QQ808311</AA></Head></Root>20180210 10:10:46发送通知成功20180210 10:10:46成功标志文件已保存。20180210 10:10:46状态2更新成功。'

root_p = re.compile(r'<Root>(.*?)</Root>', re.IGNORECASE)

soup = BeautifulSoup(string, 'html.parser')


for tmp in soup.find_all(name = 'root'):
    searchobj=re.findall(root_p,str(tmp))
    print(searchobj)

论坛徽章:
0
9 [报告]
发表于 2018-04-18 13:42 |只看该作者
python tag.py
['<head><aa>QQ808311</aa><commandcode>10001</commandcode><seq>201802101010431</seq><verifycode></verifycode><bb>103</bb>
</head><noticereq><cc>QQ808311_312020180210_802101008493712.s</cc><seqtno>802101008493712</seqtno><w5>3</w5><totalnum>2<
/totalnum><dd>687800</dd><w1>01</w1><acctype>1</acctype><w2>1</w2><w3><encryptflag>1</encryptflag><sourcedatamd5></sourc
edatamd5><encryptdd></encryptdd></w3></noticereq>']
['<noticeresp><w4>通知受理成功</w4><resultstate>2</resultstate><zz>19000210000000044087</zz><za></za><seqtno>80210100849
3712</seqtno><cc>QQ808311_312020180210_802101008493712.s</cc></noticeresp><head><verifycode></verifycode><seq>2018021010
10431</seq><commandcode>10001</commandcode><aa>QQ808311</aa></head>']

论坛徽章:
0
10 [报告]
发表于 2018-04-18 13:43 |只看该作者
BeautifulSoup 这个模块用的不熟悉,估计find_all后可以直接找出<root>.*</root>。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP