1

我有一个包含域列表的文本文件,我想使用 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 多个条目时,它会挂起并冻结。

有没有办法可以优化正则表达式以处理文本文件中的内容?

4

2 回答 2

5

(.*\.)*最有可能导致可怕的回溯。如果文件每行包含一个域,则最简单的解决方法是在每一行上执行正则表达式,而不是一次执行整个文件:

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)])
于 2013-05-16T07:07:53.310 回答
0

为避免灾难性的回溯,您可以简化正则表达式:

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$".

于 2013-05-16T12:37:41.513 回答