Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python结合regex&;在文本文件中搜索模式;字符串/文件操作和模式的存储实例?_Python_Regex_File Io_Text Mining_String Parsing - Fatal编程技术网

如何使用Python结合regex&;在文本文件中搜索模式;字符串/文件操作和模式的存储实例?

如何使用Python结合regex&;在文本文件中搜索模式;字符串/文件操作和模式的存储实例?,python,regex,file-io,text-mining,string-parsing,Python,Regex,File Io,Text Mining,String Parsing,所以本质上我在寻找一个文本文件中两个尖括号内的4位代码。我知道我需要打开文本文件,然后逐行解析,但在检查“文件中的行”之后,我不确定构建代码的最佳方式 我想我可以以某种方式拆分它,剥离它,或者分区,但我也写了一个正则表达式,我用它编译,所以如果它返回一个匹配的对象,我想我不能用它来处理那些基于字符串的操作。我也不确定我的正则表达式是否足够贪婪 我想将找到的所有命中实例存储为元组或列表中的字符串 这是我的正则表达式: regex = re.compile("(<(\d{4,5})>)?

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

我想我可以以某种方式拆分它,剥离它,或者分区,但我也写了一个正则表达式,我用它编译,所以如果它返回一个匹配的对象,我想我不能用它来处理那些基于字符串的操作。我也不确定我的正则表达式是否足够贪婪

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

这是我的正则表达式:

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

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

一次批量阅读:

import re

textfile = open(filename, 'r')
filetext = textfile.read()
textfile.close()
matches = re.findall("(<(\d{4,5})>)?", filetext)
重新导入
textfile=open(文件名'r')
filetext=textfile.read()
textfile.close()
matches=re.findall(“()?”,filetext)
逐行:

import re

textfile = open(filename, 'r')
matches = []
reg = re.compile("(<(\d{4,5})>)?")
for line in textfile:
    matches += reg.findall(line)
textfile.close()
重新导入
textfile=open(文件名'r')
匹配项=[]
reg=重新编译(“()?”)
对于文本文件中的行:
匹配项+=注册表项findall(行)
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()
重新导入
textfile=open(文件名'r')
匹配项=[]
偏移量=0
reg=重新编译(“()?”)
对于文本文件中的行:
匹配+=[(寄存器findall(行),偏移量)]
偏移量+=透镜(直线)
textfile.close()
但同时读取整个文件还是更有意义的。

import re
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())
模式=重新编译(“”) 对于i,枚举中的行(open('test.txt'): 对于re.finditer中的匹配(模式、行): 在第%s行找到了“打印”:%s“%(i+1,match.group())
关于正则表达式的几个注意事项:

  • 如果您不想将数字与尖括号匹配,而只需要数字本身,则不需要结尾处的
    和外部的
    (…)
  • 它与尖括号之间的4或5位数字匹配
更新:重要的是要理解正则表达式中的匹配和捕获可能会有很大的不同。上面代码片段中的正则表达式使用尖括号匹配模式,但我要求只捕获内部数字,而不捕获尖括号

有关python中正则表达式的更多信息,请参见:

您的文件是否太大,无法一次将整个内容保存在内存中?这个模块的最终用途是返回一个可以检查的列表或元组?所以,我不确定,但这是我想要的最终用途。嗯,有一个函数re.findall(),它返回文件中所有匹配项的列表,所以如果你将文件读入字符串(.read()),你可以在它上面运行它,它会给你一个匹配对象的列表。但是,如果文件太大,内存不足,您需要一次读取一行(或者以其他方式将其拆分)。我发现文件大小为651 kb,但如果可能,我希望限制使用太多内存,我听说逐行读取更安全?文件大小必须为GB才能成为问题。逐行执行的问题是,您的匹配只会是您读取的每一行中的索引,而不是整个文件的索引。你可以解决这个问题,但可能没有必要。什么是偏移计数器?它的用途是什么?为什么我不能调用这个模块来返回一个列表并检查列表中的字符串是否与另一个字符串匹配?哦,我不明白在原来的问题中,如果你想这样做,那么偏移计数器是不必要的。我以为你想知道字符串出现在文件的什么地方,很抱歉。你说的外部(…)是什么意思?你是说我可以匹配尖括号中所有的4-5位数?因为这就是我想要做的,除了我计划匹配,包括尖括号,然后反复使用rsplit和lsplit。@carlson:比较你的正则表达式和我的正则表达式。我只在数字周围放置了捕获参数(…)。你围绕着数字和尖括号做了些什么。因此,您的对手将返回两个-并且您只需要第一个IIUC。另请参阅我的答案更新我想我对匹配和捕获的理解稍微好一点,但要明确的是,你不是在暗示我要使用锚定,对吗?因为我只想要尖括号之间的数字实例,不知道锚定和什么有关系it@CarlCarlson:一般来说,帮你自己一个忙,花20分钟阅读——这20分钟会让你付出很多倍的代价