62

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

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

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

这是我的正则表达式:

regex = re.compile("(<(\d{4,5})>)?")

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

4

2 回答 2

68
import re
pattern = re.compile("<(\d{4,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 位数字

更新:了解正则表达式中的匹配捕获可能完全不同,这一点很重要。上面代码片段中的正则表达式与带尖括号的模式匹配,但我要求仅捕获内部数字,而不捕获尖括号。

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

于 2012-05-07T06:14:07.493 回答
37

一口气读完:

import re

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

逐行:

import re

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

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

import re

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

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

于 2012-05-07T06:13:22.823 回答