返回信息流有一个文件,内容由很多个如下的数据单元组成,没有其他数据:
<ta aaaaa>
<tb bbbbb> - <tc ccccc>
<td 2015-06-28>
现在想读取这个文件,并且输出每个ta所对应的td,以上面为例就是输出很多个这样的数据:
aaaa 2015-06-28
貌似python中的匹配只能一行一行的匹配,我可以单独的匹配到所有的ta和所有的td,但就是没办法把它们关联起来
我现在的想法是这样,挨个匹配每个数据单元中的数据,写成表达式:
(?<=<ta\s)(\w+)(.*(?=<td))(?<=<td\s)([\w|-]+)
其中(?<=<ta\s)(\w+)匹配aaaaa
(?<=<td\s)([\w|-]+)匹配2015-06-28
.*(?=<td)匹配<td之前的任意多个字符
但是实际上什么也匹配不到,我就抓狂了, .*(?=<td)为啥不能匹配<td之前的内容???
请教一下怎么才能得到 aaaaa 2015-06-28这种格式的结果呢
这是一条镜像帖。来源:北邮人论坛 / python / #7653同步于 2015/6/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
请教一个正则表达式的问题
hero210700
2015/6/28镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
【 在 aptx4689 的大作中提到: 】
: 加了re.S之类的吗
最后试出来这么一个表达式:
re.findall(r"<ta\s(\w+)(.*?(?=<td))<td\s([\w|-]+)", file, re.S)
file:
<ta 11111>
<tb bbbbb> - <tc ccccc>
<td 2015-06-28>
<ta 22222>
<tb bbbbb> - <tc ccccc>
<td 2015-06-29>
<ta 33333>
<tb bbbbb> - <tc ccccc>
<td 2015-06-30>
结果是:
('11111', '>\n <tb bbbbb> - <tc ccccc>\n ', '2015-06-28')
('22222', '>\n <tb bbbbb> - <tc ccccc>\n ', '2015-06-29')
('33333', '>\n <tb bbbbb> - <tc ccccc>\n ', '2015-06-30')
是我想要的结果。
re文档里说:
re.A (ASCII-only matching), re.I (ignore case), re.L (locale dependent), re.M (multi-line), re.S (dot matches all), and re.X (verbose), for the entire regular expression. (The flags are described in Module Contents.) (from: https://docs.python.org/3/library/re.html)
看来不加re.S的话,点号.并不是匹配所有字符,真是长见识了,thx
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。