سؤال

لديّ textfile كبير ، يحتوي على خطوط خطوط في العمود 80 بسبب عرض وحدة التحكم. العديد من الخطوط الموجودة في TextFile لا يبلغ طولها 80 حرفًا ، ولا تتأثر باختراق الخط. في الرمز الكاذب ، هذا ما أريده:

  • تكرار من خلال الخطوط في الملف
  • إذا كان الخط يطابق هذا النمط regex: ^(. {80}) n (.+)
    • استبدل هذا السطر بسلسلة جديدة تتكون من match.group (1) و match.group (2). فقط قم بإزالة الخط من هذا الخط.
  • إذا كان الخط لا يتطابق مع regex ، تخطي!

ربما لا أحتاج إلى regex للقيام بذلك؟

هل كانت مفيدة؟

المحلول

f=open("file")
for line in f:
    if len(line)==81:
       n=f.next()
       line=line.rstrip()+n
    print line.rstrip()
f.close()

نصائح أخرى

إليك بعض التعليمات البرمجية التي ينبغي للخدعة

def remove_linebreaks(textfile, position=81):
    """
    textfile : an file opened in 'r' mode
    position : the index on a line at which \n must be removed

    return a string with the \n at position removed
    """
    fixed_lines = []
    for line in textfile:
        if len(line) == position:
            line = line[:position]
        fixed_lines.append(line)
    return ''.join(fixed_lines)

لاحظ أنه بالمقارنة مع رمز الزائفة ، سيؤدي ذلك إلى دمج أي عدد من الخطوط المطوية المتتالية.

النظر في هذا.

def merge_lines( line_iter ):
    buffer = ''
    for line in line_iter:
        if len(line) <= 80:
            yield buffer + line
            buffer= ''
        else:
            buffer += line[:-1] # remove '\n'

with open('myFile','r') as source:
    with open('copy of myFile','w') as destination:
        for line in merge_lines( source ):
            destination.write(line)

أجد أن وظيفة المولد الصريحة تجعل من الأسهل بكثير اختبار وتصحيح المنطق الأساسي للبرنامج النصي دون الحاجة إلى إنشاء أنظمة ملفات وهمية أو القيام بالكثير من الإعدادات الفاخرة والدموع للاختبار.

فيما يلي مثال على كيفية استخدام التعبيرات العادية لأرشفة هذا. لكن التعبيرات العادية ليست أفضل حل في كل مكان وفي هذه الحالة ، أعتقد أن عدم استخدام التعبيرات العادية أكثر كفاءة. على أي حال ، ها هو الحل:

text = re.sub(r'(?<=^.{80})\n', '', text)

يمكنك أيضًا استخدام تعبيرك المعتاد عند الاتصال re.sub مع استدعاء:

text = re.sub(r'^(.{80})\n(.+)', lambda m: m.group(1)+m.group(2), text)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top