python重用代码,解析添加到列表和打印匹配行

时间:2014-07-20 11:35:44

标签: python regex

我正在尝试使用以下代码:

列表a包含:Benny并在two.txt中搜索并打印匹配的行benny。并包含Adarsh并将adarsh添加到列表中,并应打印adarsh的匹配行。

编码:

import re
a=[]
with open('one.txt', 'r') as f:
    for line in f:
        res = re.findall(r'(?:Dr[.](\w+))', line)
        if res: 
            a.extend(res)

print a

with open('two.txt', 'r') as f:
    lines = f.readlines()
    for key in a:
        for line in lines:
            if key in line:
                print line
        for ln1 in line          #<-obtained output lines        
        res = re.findall(r'(?:Dr[.](\w+))', ln1)
        if res: 
            a.extend(res)


        for key in a:
            for line in lines:
                if key in line:
                    print line  

one.txt包含:

  

Dr.Benny

two.txt包含:

  

本尼是好朋友Dr.Adarsh

     金是个好孩子

     

我是个好孩子

     

阿达什和他是最好的朋友。

输出获取:

  

本尼是好朋友Dr.Adarsh

期望的输出:

  

本尼是好朋友Dr.Adarsh

     

阿达什和他是最好的朋友

1 个答案:

答案 0 :(得分:1)

您的代码的第一部分很好,因此我们可以将其简化为:

import re

a = ['Benny']

然而,第二部分毫无意义。你试图在迭代它时扩展a,这可能会创建一个永无止境的循环。我想你想要的是:

with open('two.txt') as f:
    lines = f.readlines() # get lines from second file

b = [] # new names

for line in lines: # iterate once for the new names
    if any(name in line for name in a):
        b.extend(re.findall(r'(?:Dr[.](\w+))', line))

a += b # add new names to original names

for line in lines: # iterate again to display results
    if any(name in line for name in a):
        print line

请注意:

    如果列表为空,则
  1. list.extend不执行任何操作,因此无需检查;和
  2. 在您的正则表达式中添加一个可选的空格字符'\s?',并使字边界'\b'显式化,这样您就可以捕获更加明智格式的名称,例如'Dr. Adarsh'(请参阅demo )。