使用re.match挂起长文本的Python

使用re.match挂起长文本的Python,python,regex,Python,Regex,我有一个包含域列表的文本文件,我想使用python正则表达式来匹配域和任何子域 示例域文件 admin.happy.com nothappy.com 我有以下regexp: main_domain = 'happy.com' mydomains = open('domains.txt','r').read().replace('\n',',') matchobj = re.match(r'^(.*\.)*%s$' % main_domain,mydomains) 代码对于短文本很好,但是当我

我有一个包含域列表的文本文件,我想使用python正则表达式来匹配域和任何子域

示例域文件

admin.happy.com
nothappy.com
我有以下regexp:

main_domain = 'happy.com'
mydomains = open('domains.txt','r').read().replace('\n',',')
matchobj = re.match(r'^(.*\.)*%s$' % main_domain,mydomains)
代码对于短文本很好,但是当我的域文件有100多个条目时,它会挂起并冻结

有没有一种方法可以优化regexp以处理文本文件中的内容?

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

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)])
***很可能导致可怕的回溯。如果文件每行包含一个域,最简单的修复方法是在每行执行正则表达式,而不是一次执行整个文件:

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)

如果还希望匹配主域:。

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

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)

如果您还想匹配主域:。

请原谅。你在域名列表中寻找单词happy.com吗?如果是的话,没有正则表达式就不能是dong吗?对不起。你在域名列表中寻找单词happy.com吗?如果是,没有正则表达式就不能是dong吗。有趣的是,我添加了一些注释,询问为什么需要正则表达式,并看到了您的答案。nothappy.com被正则表达式no.dot拒绝。因此,在应用正则表达式之前,endswith只能用于预筛选行,并且正则表达式应该更改和行!=main\u domain->仍然不需要regexNice第二个解决方案,但可能更简单:如果打开'domains.txt',r'作为f:\n subdomains=[line[:-lenmain\u domain]作为f.read.splitlines中的line,如果line.endswithmain\u domain],则newline应该提取没有regex的子域,您需要在main\u domain前面加一个点。e、 g.,第四行,第四行+主域。您想从a.happy.com中提取a,但不想从nothappy.com中提取。有趣的是,我添加了一些注释,询问为什么需要正则表达式,并看到了您的答案。nothappy.com被正则表达式no.dot拒绝。因此,在应用正则表达式之前,endswith只能用于预筛选行,并且正则表达式应该更改和行!=main\u domain->仍然不需要regexNice第二个解决方案,但可能更简单:如果打开'domains.txt',r'作为f:\n subdomains=[line[:-lenmain\u domain]作为f.read.splitlines中的line,如果line.endswithmain\u domain],则newline应该提取没有regex的子域,您需要在main\u domain前面加一个点。e、 g.,第四行,第四行+主域。你想从a.happy.com中提取a,你不想从nothappy.com中提取。