[英]Python using re.match hangs with long text
我有一个带有域列表的文本文件,我想使用python正则表达式来匹配域和任何子域。
样本域文件
admin.happy.com
nothappy.com
我有以下正则表达式:
main_domain = 'happy.com'
mydomains = open('domains.txt','r').read().replace('\n',',')
matchobj = re.match(r'^(.*\.)*%s$' % main_domain,mydomains)
该代码可以很好地处理短文本,但是当我的域文件有100多个条目时,它会挂起并冻结。
有没有一种方法可以优化正则表达式以处理文本文件中的内容?
(.*\\.)*
最有可能导致可怕的回溯。 如果文件每行包含一个域,则最简单的解决方法是在每行上执行正则表达式,而不是一次执行整个文件:
main_domain = 'happy.com'
for line in open('domains.txt','r')):
matchobj = re.match(r'^(.*\.)*%s$' % main_domain, line.strip())
# do something with matchobj
如果您的文件除包含发布格式的域外不包含任何内容,您甚至可以进一步简化此过程,并且根本不使用正则表达式:
subdomains = []
for line in open('domains.txt','r')):
line = line.strip()
if line.endswith(main_domain):
subdomains.append(line[:-len(main_domain)])
为了避免灾难性的回溯,您可以简化正则表达式:
import re
with open("domains.txt") as file:
text = file.read()
main_domain = "happy.com"
subdomains = re.findall(r"^(.+)\.%s$" % re.escape(main_domain), text, re.M)
如果还要匹配主域: (r"^(?:(.+)\\.)?%s$"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.