Abh*_*bhi 4 python regex optimization
我需要从HTML文件中快速提取文本.我使用以下正则表达式而不是完整的解析器,因为我需要快速而不是准确(我有超过1 TB的文本).分析器显示我的脚本中的大部分时间都花在re.sub过程中.什么是加快我的过程的好方法?我可以在C中实现一些部分,但我想知道这是否有用,因为在 re.sub中花费的时间,我认为这将有效实现.
# Remove scripts, styles, tags, entities, and extraneous spaces:
scriptRx = re.compile("<script.*?/script>", re.I)
styleRx = re.compile("<style.*?/style>", re.I)
tagsRx = re.compile("<[!/]?[a-zA-Z-]+[^<>]*>")
entitiesRx = re.compile("&[0-9a-zA-Z]+;")
spacesRx = re.compile("\s{2,}")
....
text = scriptRx.sub(" ", text)
text = styleRx.sub(" ", text)
....
Run Code Online (Sandbox Code Playgroud)
谢谢!
首先,使用为此构建的HTML解析器,如BeautifulSoup:
http://www.crummy.com/software/BeautifulSoup/
然后,您可以使用分析器识别剩余的特定慢点:
http://docs.python.org/library/profile.html
为了学习正则表达式,我发现掌握正则表达式非常有价值,无论编程语言是什么:
http://oreilly.com/catalog/9781565922570
也:
由于用例的重新声明,那么对于这个请求,我会说上面的不是你想要的.我的另一个建议是:加速Python中的正则表达式
你正在处理每个文件五次,所以你应该做的第一件事(如Paul Sanwald所说)是试图通过将你的正则表达式组合在一起来减少这个数字.我也会避免使用不情愿的量词,这些量词是为了方便而牺牲效率而设计的.考虑这个正则表达式:
<script.*?</script>
Run Code Online (Sandbox Code Playgroud)
每次.去消耗另一个角色时,首先必须确保</script>在该位置不匹配.这几乎就像在每个位置做一个负向前瞻:
<script(?:(?!</script>).)*</script>
Run Code Online (Sandbox Code Playgroud)
但是我们知道,如果下一个角色是什么<,那么做前瞻是没有意义的,我们可以相应地调整正则表达式:
<script[^<]*(?:<(?!/script>)[^<]*)*</script>
Run Code Online (Sandbox Code Playgroud)
当我使用此目标字符串在RegexBuddy中测试它们时:
<script type="text/javascript">var imagePath='http://sstatic.net/stackoverflow/img/';</script>
Run Code Online (Sandbox Code Playgroud)
...不情愿的正则表达式需要173步才能完成比赛,而量身定制的正则表达式仅需28步.
将前三个正则表达式合并为一个产生这个野兽:
<(?:(script|style)[^<]*(?:<(?!/\1)[^<]*)*</\1>|[!/]?[a-zA-Z-]+[^<>]*>)
Run Code Online (Sandbox Code Playgroud)
您可能希望<HEAD>在它处于某个位置时(即,(script|style|head)).
对于角色实体,我不知道你对第四个正则表达式做了什么 - 你也只是删除它们吗?我猜第五个正则表达式必须单独运行,因为它清理的一些空格是由前面的步骤生成的.但尝试将前三个正则表达式结合起来,看看它有多大差异.这应该告诉你这种方法是否值得推进.
| 归档时间: |
|
| 查看次数: |
6106 次 |
| 最近记录: |