3

我有两种类型的文件。

一个包含如下行:

"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 吗?

4

3 回答 3

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']
于 2013-09-03T22:56:42.817 回答
0

您说:“我想获取以 LongUrl 开头并以</a>or 结尾的内容。”

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

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
于 2013-09-03T23:16:03.070 回答
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])

但是现在这种方法不是很好。

于 2013-09-03T23:25:06.113 回答