所以基本上我正在寻找文本文件中两个尖括号内的4位数代码。我知道我需要打开文本文件然后逐行解析,但我不确定在检查“for line in file”之后构建代码的最佳方法。
我想我可以以某种方式拆分它,剥离它或分区,但我也写了一个我使用编译的正则表达式,所以如果返回一个匹配对象我不认为我可以使用那些基于这些字符串操作。另外我不确定我的正则表达式是否足够贪婪......
我想将所有找到的匹配的实例存储为元组或列表中的字符串。
这是我的正则表达式:
regex = re.compile("(<(\d{4,5})>)?")
到目前为止,我认为我不需要包含所有那么多代码。
答案 0 :(得分:38)
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.groups())
关于正则表达式的一些注释:
?
和(...)
外部,但只需要数字本身更新:了解正则表达式中的匹配和捕获非常重要。我上面的代码段中的正则表达式匹配带尖括号的模式,但我要求仅捕获内部数字,不带尖括号。
答案 1 :(得分:17)
一次性阅读:
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()
但是,立即阅读整个文件仍然更有意义。