Python 正则表达式的问题

Python 正则表达式的问题,python,regex,file-io,Python,Regex,File Io,我需要在文件中找到一个字符串;我将文件中的字符串复制并粘贴到pattern spot中,但仍然找不到它。print命令返回除名字以外的空字符串。这是我的密码: def fillWindow(self,student): global fileDirectory location = path.join(fileDirectory, student + '.txt') file = open(location, 'r') # find item in list a

我需要在文件中找到一个字符串;我将文件中的字符串复制并粘贴到pattern spot中,但仍然找不到它。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
[default]
firstName: test
lastName: one
family: family

我认为file.read将移动光标,因此后续调用将尝试从文件末尾读取


您可以先将文件内容读入变量,然后在其中执行正则表达式搜索。

我认为file.read将移动光标,以便后续调用将尝试从文件末尾读取


您可以先将文件的内容读入变量,然后在其中执行正则表达式搜索。

您最好使用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)

您最好使用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)

如果可以使文件格式更灵活一些,那么可以在2.X中使用内置的配置解析器模块ConfigParser,在3.X中使用ConfigParser

对于文件:

firstName: test
lastName: one
family: family
[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')
或者编辑,您的原始文件可以使用eyquem指出的csv进行解析:

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]

如果可以使文件格式更灵活一些,那么可以在2.X中使用内置的配置解析器模块ConfigParser,在3.X中使用ConfigParser

对于文件:

firstName: test
lastName: one
family: family
[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')
或者编辑,您的原始文件可以使用eyquem指出的csv进行解析:

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]

妈妈咪呀!太复杂了

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')
顺便问一下,指令全局文件目录的用途是什么

我想有几个部分是这样的

firstName: test
lastName: one 
family: family

那么为什么不使用csv.reader或csv.DictReader呢?

妈妈咪呀!太复杂了

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')
顺便问一下,指令全局文件目录的用途是什么

我想有几个部分是这样的

firstName: test
lastName: one 
family: family

那么为什么不使用csv.reader或csv.DictReader呢?

因为我以前从未使用过它!太棒了。而且我从未见过configparser模块!现在我知道了。极好的因为我以前从未用过!太棒了。而且我从未见过configparser模块!现在我知道了。极好的