BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #7653同步于 2015/6/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

请教一个正则表达式的问题

hero210700
2015/6/28镜像同步5 回复
有一个文件,内容由很多个如下的数据单元组成,没有其他数据: <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这种格式的结果呢
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
Leavetaking机器人#1 · 2015/6/28
re.MULTILINE
aptx4689机器人#2 · 2015/6/29
加了re.S之类的吗
hero210700机器人#3 · 2015/6/29
好像与MULTILINE无关。。 【 在 Leavetaking 的大作中提到: 】 : re.MULTILINE
hero210700机器人#4 · 2015/6/29
【 在 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
aptx4689机器人#5 · 2015/6/29
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。