سؤال

كيف يمكن كتابة تعبير عادي لاستخدامه في بايثون لتقسيم الفقرات؟

يتم تعريف الفقرة بواسطة فاصلي أسطر ( ).ولكن يمكن للمرء أن يحتوي على أي قدر من المسافات/علامات التبويب مع فواصل الأسطر، ولا يزال ينبغي اعتبارها فقرة.

أنا أستخدم بايثون حتى يتمكن الحل من استخدام بايثون بناء جملة التعبير العادي الذي تم تمديده.(يمكن الاستفادة من (?P...) أشياء)

أمثلة:

the_str = 'paragraph1\n\nparagraph2'
# splitting should yield ['paragraph1', 'paragraph2']

the_str = 'p1\n\t\np2\t\n\tstill p2\t   \n     \n\tp3'
# should yield ['p1', 'p2\t\n\tstill p2', 'p3']

the_str = 'p1\n\n\n\tp2'
# should yield ['p1', '\n\tp2']

أفضل ما يمكنني أن آتي به هو: r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', ، أي.

import re
paragraphs = re.split(r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', the_str)

ولكن هذا قبيح.أي شيء أفضل؟

يحرر:

الاقتراحات المرفوضة:

r'\s*?\n\s*?\n\s*?' -> وهذا من شأنه أن يجعل المثالين 2 و 3 يفشلان، منذ ذلك الحين \s يشمل \n, ، لذلك سيسمح بفواصل الفقرات بأكثر من 2 \nس.

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

المحلول

لسوء الحظ، لا توجد طريقة لطيفة لكتابة "مسافة ولكن ليس سطرًا جديدًا".

أعتقد أن أفضل ما يمكنك فعله هو إضافة بعض المساحة باستخدام ملف x المعدل ومحاولة استبعاد القبح قليلاً، لكن هذا أمر مشكوك فيه: (?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

يمكنك أيضًا محاولة إنشاء قاعدة فرعية لفئة الأحرف فقط وإدخالها ثلاث مرات.

نصائح أخرى

هل تحاول استنتاج بنية المستند في اختبار عادي؟هل تفعل ماذا docutils يفعل؟

قد تتمكن ببساطة من استخدام محلل المستندات بدلا من لفة بنفسك.

ليس تعبيرًا عاديًا ولكنه أنيق حقًا:

from itertools import groupby

def paragraph(lines) :
    for group_separator, line_iteration in groupby(lines.splitlines(True), key = str.isspace) :
        if not group_separator :
            yield ''.join(line_iteration)

for p in paragraph('p1\n\t\np2\t\n\tstill p2\t   \n     \n\tp'): 
    print repr(p)

'p1\n'
'p2\t\n\tstill p2\t   \n'
'\tp3'

الأمر متروك لك لتجريد الإخراج حسب حاجتك إليه بالطبع.

مستوحاة من "كتاب الطبخ بايثون" الشهير؛-)

نفس الشيء تقريبًا، ولكن باستخدام محددات كمية غير جشعة والاستفادة من تسلسل المسافات البيضاء.

\s*?\n\s*?\n\s*?
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top