Как найти и изменить запись в записи фиксированной длины без сопоставления полей, содержащих одинаковые символы? Ex. «Смит» верен в Смитерс - PullRequest
3 голосов
/ 14 октября 2019

Мне нужно найти (F) имя_стали (L) имя_стали в записи и изменить (B) день рождения для этой записи. Ввод, который получает меня, - это когда «Адам», «Смит», как в «Адаме Смите» и Адаме Смитерсе, и обе даты рождения меняются. Я попытался с помощью индексации изолировать фамилию и сравнить ее со значением «L», но она никогда не регистрировалась как true.

if re.search(F, recordLine):
   lastName = recordLine[start+16:start+32]
   if L == lastName:
     recordLine = record[start:start + recordLength - 8]+ B 

Я пытался заменить этот код для оператора if в кодеЯ написал ниже ниже, чтобы попытаться решить проблему, но она никогда не возвращает True.

recordLength = 40
start = 0
recordList = []

file1 = open(P, 'r')
record = file1.read()
file1.close()
file1 = open(P, 'w')
while( (len(record) - start) >= recordLength):

  recordLine = record[start:start + recordLength]
  recordList.append(recordLine)
  if re.search(F, recordLine) and re.search(L, recordLine):    
    recordLine = record[start:start + recordLength - 8]+ B     
  file1.write(recordLine)
  start+= recordLength  
file1.close()
Your output:
Adam            Smith           11111900* 
Theodore        Anderson        03201990 
Monty           Biscuit-Barrel  10181980 
Adam            Smithers        11111900* 
Ruthy           Anderson        06062010
Expected output:
Adam            Smith           11111900*
Theodore        Anderson        03201990
Monty           Biscuit-Barrel  10181980
Adam            Smithers        10101960
Ruthy           Anderson        06062010

Указанные (B) даты обновления - те, которые изменились. Кажется, что используемая нами программа Codio запускает код с разными переменными, чтобы убедиться, что он функционирует, поэтому трудно точно знать, что это такое. Но моя проблема возникает, когда F = Адам и L = Смит

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

У вас есть Имя и Фамилия, поэтому вы можете создать шаблон, подобный этому r'Adam\s+Smith\s+', но позвольте сказать, что имя может иметь несколько слов.

Чтобы справиться с этим, мы знаем, что length имя 16, фамилия 16, день рождения 8, мы можем извлечь эту информацию с помощью нарезки или регулярного выражения:

import re

FIRST_NAME = 'Adam'
LAST_NAME = 'Smith'
P = 'data.txt'
B = '11111900'

# if every record is in one line do this is better
with open(P, 'r') as readable_file1:
    records = readable_file1.readlines()


with open(P, 'w') as writable_file1:
    for record in records:
        # you can do by slicing like you did
        info = re.search('(.{16})(.{16})(.{8})', record)
        if info:
            first_name, last_name, birthday = info.groups()
            if first_name.strip() == FIRST_NAME and last_name.strip() == LAST_NAME:
                print('Record to update: ', record)
                record = record[:32] + B + '\n'
        writable_file1.write(record)
0 голосов
/ 14 октября 2019

Вам нужны регулярные выражения.

Вы уже используете re для поиска, поэтому вы на полпути.

По существу, регулярные выражения позволяют вам искать шаблон букв, а не сами буквы - в вашем случае, вы хотите найти фразу, которая соответствует «Смиту», а затем останавливается, без букв.

В регулярных выражениях $ - это символ, который означает «и не более символов» - он соответствует концу строки. «Smith $» будет соответствовать слову «Smith», но не «Smithers» или «Smithson».

Просмотрите документацию , а также regexr .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...