RE处理这两种格式

时间:2013-09-03 22:52:18

标签: python regex

我有两种类型的文件。

一个包含以下行:

"55.28 LongUrl0.20s: Preplan Async"

另一个包含该行作为打击:

>55.28 LongUrl0.20s: Preplan Async</a></span><br></td>

在这两种情况下,我都希望从LongUrl开始,以</a>或行尾结束。

>>> b="55.28 LongUrl0.20s: Preplan Async"
>>> a=">55.28 LongUrl0.20s: Preplan Async</a></span><br></td>"
>>> re.findall(r'LongUrl\d*.\d*s:[^<]+',a)
['LongUrl0.20s: Preplan Async']
>>> re.findall(r'LongUrl\d*.\d*.*$',b)
['LongUrl0.20s: Preplan Async']

你能帮助一个可以覆盖两者的RE吗?

3 个答案:

答案 0 :(得分:2)

为什么不只是LongUrl\d+[^<]+

>>> import re
>>> a = ">55.28 LongUrl0.20s: Preplan Async</a></span><br></td>"
>>> b = "55.28 LongUrl0.20s: Preplan Async"
>>> re.findall(r'LongUrl\d+[^<]+', a)
['LongUrl0.20s: Preplan Async']
>>> re.findall(r'LongUrl\d+[^<]+', b)
['LongUrl0.20s: Preplan Async']

答案 1 :(得分:0)

你说:“我希望从LongUrl开始,以</a>或行尾结束。”

好的,那就是这个正则表达式:

LongUrl(.*?)(?:</a>|$)

此模式表示:“首先匹配文字字符串LongUrl。然后启动匹配组,并在匹配组内部执行与任何匹配的非贪婪模式。在匹配组之后,启动不匹配组,在非匹配组内,匹配</a>或行尾。“

我喜欢为白色空间添加不匹配的模式,因此如果空间出现在我们想要的文本周围,则不会抓取空白区域。您可以使用此模式轻松匹配0个或更多空格字符:\s*

将它放在一起,这是一个有效的代码示例。

import re
s_pat = r'LongUrl\s*(.*?)\s*(?:</a>|$)'
pat = re.compile(s_pat)
s0 = "55.28 LongUrl0.20s: Preplan Async"
s1 = ">55.28 LongUrl0.20s: Preplan Async</a></span><br></td>"
m = pat.search(s0)
print(m.group(1))  # prints: 0.20s: Preplan Async
m = pat.search(s1)
print(m.group(1))  # prints: 0.20s: Preplan Async

答案 2 :(得分:0)

您还可以使用字符串方法:

>>> a[a.index("LongUrl"):].partition("</a>")[0]
'LongUrl0.20s: Preplan Async'
>>> b[b.index("LongUrl"):].partition("</a>")[0]
'LongUrl0.20s: Preplan Async'

根据另一个答案中的评论(LongUrl后必须有一个数字),您可以将上述内容分配给match并执行此操作:

str.isdigit(match[7])

但现在这种方法并不好。