我有两种类型的文件。
一个包含以下行:
"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吗?
答案 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])
但现在这种方法并不好。