在字符串
中 <td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>
我正在尝试提取并复制到剪贴板
的Mozilla / 5.0 (Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样) Chrome / 60.0.3112.113 Safari / 537.36
在https://regexr.com/使用正则表达式测试程序,我发现这个正则表达式完成了我想要的:
(?<=<td class="useragent"><a href=".*">).*(?=</a>)
当我在Sublime Text中尝试它时,它没有。我猜这与RegEx的不同'风味'有关,那么如何更改此RegEx以使用Sublime Text?
答案 0 :(得分:1)
你不能在PCRE正则表达式中使用未知长度的lookbehind(它是Sublime Text 3中使用的正则表达式库)。但是,由于您使用的是肯定的外观,因此您可以使用 \K
匹配重置运算符(它将丢弃与匹配内存缓冲区匹配的所有文本)。
此外,您可能会考虑一些增强功能:
".*"
可能会在代码中溢出,请使用"[^"]*"
代替.*</a>
可能会到达最后一行</a>
,使用.*?</a>
转到第一行<a>
节点中有换行符,请使用(?s)
DOTALL内联修饰符使.*?
跨行匹配使用
(?s)<td class="useragent"><a href="[^"]*">\K.*?(?=</a>)
^^
请参阅regex demo。
ST3测试:
请参阅 regular-expressions.info 上的Keep The Text Matched So Far out of The Overall Regex Match。
从解析任意HTML的数据时,您应该小心谨慎。如果您想从大HTML中获取所需的所有文本,则应考虑使用完整的HTML DOM支持技术。以下是使用PHP(see an online PHP demo)的示例:
$text = <<<EOD
<td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>
EOD;
$domDocument = new DOMDocument;
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($domDocument);
$nodes = $xpath->query('//td[@class="useragent"]/a');
$res = [];
foreach($nodes as $txt) {
array_push($res, $txt->textContent);
}
print_r($res);
结果:
Array
(
[0] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
)
此处,$text
是您的HTML文字,//td[@class="useragent"]/a
是一个XPath,可获取td
属性值等于class
的所有useragent
个节点,然后在其中抓取a
个节点。实际文本随$txt->textContent
一起返回。
答案 1 :(得分:0)
我在这里的所有内容都是Python,我针对你发布的字符串测试<td class="useragent"><a .*>(.*)</a></td>
并且它有效。看
>>> import re
>>> agent=re.compile(r'<td class="useragent"><a .*>(.*)</a></td>')
>>> s='<td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>'
>>> agent.findall(s)
['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36']
>>>
我希望有所帮助。