【问题标题】:Match the pattern and print next line匹配模式并打印下一行
【发布时间】:2016-04-04 05:32:27
【问题描述】:

我有一个包含某些规则的文本文件。这是它的格式:

:SchoolName (rule_1)
)
:xyz (true)
:abc_efg (
    : xxyyzz-x1y1-z1z2-z3z4
)
  1. 我想匹配 ':abc_efg' 并在匹配后得到行,即 ':xxyyzz-x1y1-z1z2-z3z4'
  2. 每次有新文件时,它都会查找 ':abc_efg' 并在匹配后得到相应的行

到目前为止我已经尝试过

with open('G:\CM\Python Exercises\Project_F\abc.txt') as f:
    text = f.read()
    list1=text.strip('\n\t').split(':')
    print list1
    for line in list1:
        if ':abc_efg' in list1:
            print line
            print '\n'.join(list1[i+1])

打印列表1显示

[':abc_efg (\n\t\t\t', ': xxyyzz-x1y1-z1z2-z3z4 \n\t\t)\n\t\t']

【问题讨论】:

    标签: python pattern-matching generator regex-lookarounds


    【解决方案1】:

    使用 f.readline() 逐行读取文件。

    当有匹配时,它可以很容易地获取下一行。

    with open('abc.txt') as f:
        a = ' '
        while(a):
            a = f.readline()
            l = a.find(':abc_efg') #Gives a non-negative value when there is a match
            if ( l >= 0 ):
                print f.readline()
    

    【讨论】:

      【解决方案2】:

      使用以下正则表达式,首先它是高效,其次,如果用于繁重的解析,str 方法会失控。

      import re
      pat = re.compile(r":(?P<x>.+?)\s\(\s+:\s(?P<y>.+?)\s\)")
      with open(somefile) as fr:
          match = pat.search(fr.read())
          print(match.groupdict())
      
      
      Out[111]: {'x': 'abc_efg', 'y': 'xxyyzz-x1y1-z1z2-z3z4'}
      

      将正则表达式分成多行以便清楚地查看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多