如何使用 Python 结合正则表达式和字符串/文件操作在文本文件中搜索模式并存储模式的实例?

Posted

技术标签:

【中文标题】如何使用 Python 结合正则表达式和字符串/文件操作在文本文件中搜索模式并存储模式的实例?【英文标题】:How do I search for a pattern within a text file using Python combining regex & string/file operations and store instances of the pattern? 【发布时间】:2012-05-15 16:16:47 【问题描述】:

所以基本上我正在寻找文本文件中两个尖括号内的 4 位代码。我知道我需要打开文本文件然后逐行解析,但我不确定在检查“文件中的行”之后构建代码的最佳方法。

我认为我可以以某种方式拆分、剥离或分区,但我还编写了一个正则表达式,我在其上使用了编译,所以如果它返回一个匹配对象,我认为我不能将它与那些基于字符串的对象一起使用操作。另外我不确定我的正则表达式是否足够贪婪......

我想将找到的命中的所有实例作为字符串存储在元组或列表中。

这是我的正则表达式:

regex = re.compile("(<(\d4,5)>)?")

考虑到到目前为止它相当基本,我认为我不需要包含那么多代码。

【问题讨论】:

您的文件是否太大而无法一次将整个内容保存在内存中? 这个的最终用途是一个返回可以检查的列表或元组的模块?所以,我不确定,但这就是我想要的最终用途。 嗯,有一个函数 re.findall() 返回文件中所有匹配项的列表,所以如果你将文件读入字符串 (.read()) 你可以运行它它会为您提供匹配对象的列表。但是,如果文件太大而无法存储,您需要一次读取一行(或者您想将其拆分) 好吧,我发现文件是 651 kb,但如果可能的话,我想限制使用太多内存,而且我听说逐行这样做更安全? 一个文件必须是千兆字节才能成为问题。逐行执行的问题在于,您的匹配项只会是您读取的每一行中的索引,而不是整个文件的索引。您可以解决这个问题,但可能没有必要。 【参考方案1】:
import re
pattern = re.compile("<(\d4,5)>")

for i, line in enumerate(open('test.txt')):
    for match in re.finditer(pattern, line):
        print 'Found on line %s: %s' % (i+1, match.group())

关于正则表达式的几点说明:

如果您不想将数字与尖括号匹配,而只需要数字本身,则不需要末尾的 ? 和外部的 (...) 匹配尖括号之间的 4 位或 5 位数字

更新:了解正则表达式中的 matchcapture 可能完全不同,这一点很重要。上面我的 sn-p 中的正则表达式匹配模式 with 尖括号,但我要求只捕获内部数字,没有尖括号。

更多关于python中的正则表达式可以在这里找到: Regular Expression HOWTO

【讨论】:

外部(...)是什么意思?你是说我可以匹配尖括号之间的所有 4-5 位数字#?因为这就是我想要做的,除了我计划匹配包括尖括号,然后迭代地使用 rsplit 和 lsplit。 @CarlCarlson:将您的正则表达式与我的进行比较。我只在数字周围放置了捕获括号(...)。您围绕数字 进行了尖括号。所以你的比赛将同时返回——你只需要第一个 IIUC。 另请参阅我的答案更新 我想我理解匹配和捕获更好一点,但为了清楚起见,你不是在暗示我的意思是使用锚定对吗?因为我只想要尖括号之间的数字实例。 不确定锚定与它有什么关系 @CarlCarlson:一般来说,帮自己一个忙,花 20 分钟阅读 docs.python.org/library/re.html - 这 20 分钟会得到很多倍的回报【参考方案2】:

一口气读完:

import re

textfile = open(filename, 'r')
filetext = textfile.read()
textfile.close()
matches = re.findall("(<(\d4,5)>)?", filetext)

一行一行:

import re

textfile = open(filename, 'r')
matches = []
reg = re.compile("(<(\d4,5)>)?")
for line in textfile:
    matches += reg.findall(line)
textfile.close()

但同样,除非您添加了偏移计数器,否则返回的匹配项除了计数之外没有任何用处:

import re

textfile = open(filename, 'r')
matches = []
offset = 0
reg = re.compile("(<(\d4,5)>)?")
for line in textfile:
    matches += [(reg.findall(line),offset)]
    offset += len(line)
textfile.close()

但一次读取整个文件仍然更有意义。

【讨论】:

什么是偏移计数器,目的是什么?为什么我不能调用这个返回列表的模块并检查列表中的字符串是否与另一个字符串匹配? 哦,我不明白在原来的问题中,如果这是你想要做的,那么偏移计数器是不必要的。我假设您想知道字符串出现在文件中的哪个位置,我深表歉意。

以上是关于如何使用 Python 结合正则表达式和字符串/文件操作在文本文件中搜索模式并存储模式的实例?的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式如何进行字符串替换

如何从python中的正则表达式匹配中返回一个字符串? [复制]

结合多个详细的python正则表达式

Shell中的if结合正则表达式使用

Shell中的if结合正则表达式使用

Python 正则表达式和版权符号