Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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 在正则表达式搜索中循环_Python_Regex_Parsing_Csv - Fatal编程技术网

Python 在正则表达式搜索中循环

Python 在正则表达式搜索中循环,python,regex,parsing,csv,Python,Regex,Parsing,Csv,我有一些需要解析的.csv文件,我被困在一个需要在不同行中分开的部分。为了说明这一点: 其中一个部分是,如果一个键的值是Y,它应该检查该文件的类别数[立即工作] 这是示例csv: 004 000000,Y 005 000000,N 006 000000,N 007 A000000,Y 007 B000000,16 007 C010100,1 007 C020100,XTF ADVISORS TRUST - ETF 2010 PORTFOLIO 007 C030100,Y 007 C

我有一些需要解析的.csv文件,我被困在一个需要在不同行中分开的部分。为了说明这一点:

  • 其中一个部分是,如果一个键的值是Y,它应该检查该文件的类别数[立即工作]
这是示例csv:

004  000000,Y 
005  000000,N 
006  000000,N
007 A000000,Y
007 B000000,16
007 C010100,1
007 C020100,XTF ADVISORS TRUST - ETF 2010 PORTFOLIO
007 C030100,Y
007 C010200,2
007 C020200,XTF ADVISORS TRUST - ETF 2015 PORTFOLIO
007 C030200,Y
007 C010300,3
007 C020300,XTF ADVISORS TRUST - ETF 2020 PORTFOLIO
007 C030300,Y
007 C010400,4
007 C020400,XTF ADVISORS TRUST - ETF 2025 PORTFOLIO
007 C030400,Y
007 C010500,5
007 C020500,XTF ADVISORS TRUST - ETF 2030 PORTFOLIO
007 C030500,Y
007 C010600,6
此部分的Python代码返回与007 A000000相关的节数和行数:

def haveSeries(csvfile):
with open(csvfile, 'rb') as f:
    reader = csv.reader(f)
    row2 = 0
    for row in reader:
        if (row[0] == '007 A000000') and (row[1]=='Y'):
            baseline = reader.line_num
            print baseline
            seriesnum = reader.next()
            print seriesnum[1]
            return (baseline,seriesnum[1])
对于上面的示例,它返回16,因此我们有16个类别。因此,现在我应该制作另一个csv,在所有行和每行的下一列中包含与类别号相关的所有
[Key,Values]
直到
[007 A000000,Y]
。 类别在键中编号,如

086 D020000,0
086 E010000,0
086 E020000,0
086 F010000,0
086 F020000,0
024  000100,N
025 D000101,0
025 D000102,0
025 D000103,0
025 D000104,0
025 D000105,0
025 D000106,0
025 D000107,0
***... Category 1 starts at 024 000100 ...***
075 A000100,0
075 B000100,0
076  000100,0.00
024  000200,N
025 D000201,0
025 D000202,0
025 D000203,0
025 D000204,0
025 D000205,0
***... category 2 starts at 024 000200... and so on***
因此,识别这些变量的正则表达式类似于
\d{3}(\w})\d{3}X\d.{,}
,对于X,我必须迭代1到16次,并且每个类别都有不同的行

我为此部分编写的代码:

if haveSeries(csvfile) != False:
        seriesBaseNNum=haveSeries(csvfile)
        # TODO write all the lines from 1 to baseline again
        for row in reader:
           for i in xrange(1,int(seriesBaseNNum[1])):
                i= u'%02d' % i # two digits
                seriesi = re.compile ("\d{3}( \w|  )\d{3}%s\d.{,}" % i) #err on %d so changed to %s
                matchers = seriesi.search(row[0])
                if matchers:
                    print matchers.**group(0)**
但我得到的输出如下:

074 T000100
074 U010100
074 U020100
074 V010100
074 V020100
074 W000100
074 X000100
074 Y000100
075 A000100
075 B000100
076  000100
024  001100
025 D001101
025 D001102
025 D001103
025 D001104
025 D001105
025 D001106
025 D001107
025 D001108
028 A011100
028 A021100
028 A031100
028 A041100
028 B011100
028 B021100
028 B031100
028 B041100
028 C011100
028 C021100
...
所以它只在i=1时迭代一次(碰巧i=11,我的意思是当%s为1且之前的字符也为1时)

  • 在本例中,如何在正则表达式上进行迭代以查找I=1到16的所有匹配项
  • 我应该如何实现必须为所有类别编写第一个n列,并将其余内容写入每行的下一列的部分

  • 您的
    匹配器
    变量是一个
    匹配对象
    。根据,您可以通过
    访问结果

    >>> import re
    >>> m = re.search('(?<=abc)def', 'abcdef')
    >>> m.group(0)
    'def'
    
    >>重新导入
    
    >>>m=re.search(“(?问题在于正则表达式,条件行应该是:

    seriesi = re.compile ("\d{3}( \w|  )\d{2}%02d\d{2}.{,}" %i)
    
    然后一个for循环从1到类别数,将1写入seriesBaseNNum[0],另一个for循环将类别写入cvs中的每一行


    谢谢您的帮助。

    您好,我编辑了您的问题,使其在csv示例中的阅读效果更好。您能检查一下您最初的意图吗?我想我的下一行字符丢失了;)谢谢JerryThank,这解决了显示输出的问题。但是我怎么做循环呢?用我的代码,我只得到I=1的结果(而I=11是因为1)。