проблема с регулярными выражениями - PullRequest
1 голос
/ 24 февраля 2011

Мне нужно найти строку внутри файла;Я скопировал и вставил точную строку из файла в область шаблона, но все еще не могу ее найти.Команды print возвращают пустые строки, кроме имени.Вот мой код:

def fillWindow(self,student):
    global fileDirectory
    location = path.join(fileDirectory, student + '.txt')
    file = open(location, 'r')

    # find item in list and then place it in the text box   
    firstName = re.findall(r'firstName\:', file.read())
    print(firstName)
    self.firstNameBox.insert(0,'firstName')

    lastName = re.findall(r'lastName\:', file.read())
    print(lastName)
    self.lastNameBox.insert(0,'lastName')

    family = re.findall(r'family\:', file.read())
    print(family)
    self.familyNameBox.insert(0,'family')

    file.close()

А вот содержимое файла:

firstName: test
lastName: one
family: family

Ответы [ 4 ]

5 голосов
/ 24 февраля 2011

Я думаю, file.read () переместит курсор, поэтому последующие вызовы будут пытаться прочитать с конца файла.

Вы можете сначала прочитать содержимое файла в переменную, а затем выполнить поиск по регулярному выражению в этом.

1 голос
/ 24 февраля 2011

Лучше было бы прочитать строки файла, используя readlines () или xreadlines (). Примерно так:

input = open('input')

for line in input.xreadlines():
  if line.startswith('firstName'):
    firstname = line.split()[1]
  elif line.startswith('lastName'):
    lastname = line.split()[1]
  elif line.startswith('family'):
    family = line.split()[1]

input.close()

print firstname
print lastname
print family

Кроме того, если вы хотите использовать для этого регулярное выражение, вам нужно использовать что-то вроде:

import re
line = "family: blah"
m = re.search("family: (.*)", line)
if m != None:
  print m.group(1)
0 голосов
/ 24 февраля 2011

Мама Мия!Столько сложностей!

def fillWindow(student):
    global fileDirectory
    location = path.join(fileDirectory, student + '.txt')

    pat = re.compile('firstName: (.*)\r?\n'
                     'lastName: (.*)\r?\n'
                     'family: (.*)')

    with open(location, 'r') as f:
        ch = f.read()

        firstName,lastName,family = pat.search(ch).groups()
        # or li = pat.findall(ch) if there are several

        print(firstName)
        self.firstNameBox.insert(0,'firstName')
        print(lastName)
        self.lastNameBox.insert(0,'lastName')
        print(family)
        self.familyNameBox.insert(0,'family')

Кстати, какова цель инструкции global fileDirectory ??

Полагаю, есть несколько разделов, таких как

firstName: test
lastName: one 
family: family

так почему бы не использовать csv.reader () или csv.DictReader () ?

0 голосов
/ 24 февраля 2011

Если вы можете сделать формат файла немного более гибким, вы можете использовать встроенный модуль Config Parser (ConfigParser в 2.X, configparser в 3.x)

Для файла:

[default]
firstName: test
lastName: one
family: family

Следующий код будет работать нормально:

import ConfigParser

def fillWindow(self,student):
    global fileDirectory
    location = path.join(fileDirectory, student + '.txt')
    parser = ConfigParser.ConfigParser()
    parser.read(location)
    firstName = parser.get('default','firstName')
    lastName = parser.get('default','lastName')
    family = parser.get('default','family')

РЕДАКТИРОВАТЬ Альтернативно, ваш исходный файл может быть проанализирован с помощью csv, как указано eyquem:

import csv

def fillWindow(self,student):
    global fileDirectory
    location = path.join(fileDirectory, student + '.txt')
    reader = csv.reader(open(location),delimiter=':')
    dict = {}
    for row in reader:
        dict[row[0]] = row[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...