Hướng dẫn python re multiline - python lại nhiều dòng

Tôi có một tệp được cấu trúc như thế này:

A: some text
B: more text
even more text
on several lines
A: and we start again
B: more text
more
multiline text

Tôi đang cố gắng tìm ra regex sẽ phân chia tệp của tôi như thế này:

>>>re.findall(regex,f.read())
[('some text','more text','even more text\non several lines'),
 ('and we start again','more text', 'more\nmultiline text')]

Cho đến nay, tôi đã kết thúc với những điều sau:

>>>re.findall('A:(.*?)\nB:(.*?)\n(.*?)',f.read(),re.DOTALL)
[(' some text', ' more text', ''), (' and we start again', ' more text', '')]

Các văn bản đa dòng không bị bắt. Tôi đoán là bởi vì vòng loại lười biếng thực sự lười biếng và không bắt được, nhưng tôi lấy nó ra, Regex trở nên thực sự tham lam:

>>>re.findall('A:(.*?)\nB:(.*?)\n(.*)',f.read(),re.DOTALL)
[(' some text',
' more text',
'even more text\non several lines\nA: and we start again\nB: more text\nmore\nmultiline text')]

Có ai có ý tưởng không? Cảm ơn !

Nếu bạn muốn có 2 nhóm chụp với giá trị phần mềm (có thể chứa khoảng trắng) trong nhóm 1 và phiên bản trong nhóm 2, bạn có thể sử dụng sự khác biệt về số lượng chars trắng giữa các giá trị (giả sử phần mềm không chứa nhiều chars trắng hơn hơn giữa các lĩnh vực)

Nội phân chính

  • TÌnh Huống 1: Khi
  • Trường hợp 2: Khie những người Khác Đan mã CủA BạN
  • Cách viết bình luận trong python
  • NHận Xét nhs
^(?:AA|BB)\s{2,}(\S.*?)\s{2,}(\S+)
  • ^ Bắt đầu chuỗi
  • (?:AA|BB) khớp với
    >>>re.findall(regex,f.read())
    [('some text','more text','even more text\non several lines'),
     ('and we start again','more text', 'more\nmultiline text')]
    
    0 hoặc
    >>>re.findall(regex,f.read())
    [('some text','more text','even more text\non several lines'),
     ('and we start again','more text', 'more\nmultiline text')]
    
    1 trong một nhóm không bắt giữ
  • >>>re.findall(regex,f.read())
    [('some text','more text','even more text\non several lines'),
     ('and we start again','more text', 'more\nmultiline text')]
    
    2 Trận đấu 2 trở lên Chars không gian trắng
  • >>>re.findall(regex,f.read())
    [('some text','more text','even more text\non several lines'),
     ('and we start again','more text', 'more\nmultiline text')]
    
    3 Nhóm 1 Chụp một Char không Whitspace Char, sau đó là bất kỳ char nào ít nhất có thểGroup 1 capture a single non whitspace char followed by any char as least as possible
  • >>>re.findall(regex,f.read())
    [('some text','more text','even more text\non several lines'),
     ('and we start again','more text', 'more\nmultiline text')]
    
    2 Trận đấu 2 trở lên Chars không gian trắng
  • >>>re.findall(regex,f.read())
    [('some text','more text','even more text\non several lines'),
     ('and we start again','more text', 'more\nmultiline text')]
    
    3 Nhóm 1 Chụp một Char không Whitspace Char, sau đó là bất kỳ char nào ít nhất có thểgroup 2, capture 1+ non whitespace chars

>>>re.findall(regex,f.read())
[('some text','more text','even more text\non several lines'),
 ('and we start again','more text', 'more\nmultiline text')]
5 Nhóm 2, nắm bắt 1+ Chars không trắng

Xem bản demo regex.

import re

pattern = r"^(?:AA|BB)\s{2,}(\S.*?)\s{2,}(\S+)"

s = ("||/ software                                   version                                          some_text    Description\n"
            "+++-======================================-===================================================-============-===============================================================================\n"
            "AA  SOFTWARE1 this is some text                                   1.1.1.1-UBUNTU                                  GHGFHGFH     Description1\n"
            "AA  SOFTWARE2                                   1.1.1.2-UBUNTU_HGSFHF                           JGJHGKGK     Description2\n"
            "BB  SOFTWARE3                                   1.2.3.4.5                                       JHGJHGJG     Description3")


dct = dict(re.findall(pattern, s, re.M))
print(dct)

Nếu bạn muốn tạo một từ điển với nhóm 1 làm khóa và nhóm 2 là giá trị:

{'SOFTWARE1 this is some text': '1.1.1.1-UBUNTU', 'SOFTWARE2': '1.1.1.2-UBUNTU_HGSFHF', 'SOFTWARE3': '1.2.3.4.5'}

Đầu ra

^(?:AA|BB)\s{2,}(\S.*?)\s{2,}(\d+(?:\.\d+)*(?:-\w+)?)

Bạn cũng có thể làm cho mẫu cụ thể hơn một chút, khớp dữ liệu ví dụ cho cột phiên bản:

Demo Regex

Nội phân chính

  • TÌnh Huống 1: Khi
  • TÌnh Huống 1: Khi
  • Trường hợp 2: Khie những người Khác Đan mã CủA BạN
  • Cách viết bình luận trong python
  • Cách viết bình luận trong python
  • NHận Xét nhs
  • ^ Bắt đầu chuỗi

(?:AA|BB) khớp với

>>>re.findall(regex,f.read())
[('some text','more text','even more text\non several lines'),
 ('and we start again','more text', 'more\nmultiline text')]
0 hoặc
>>>re.findall(regex,f.read())
[('some text','more text','even more text\non several lines'),
 ('and we start again','more text', 'more\nmultiline text')]
1 trong một nhóm không bắt giữ

TÌnh Huống 1: Khi

Trường hợp 2: Khie những người Khác Đan mã CủA BạN

Cách viết bình luận trong python

NHận Xét nhs

^ Bắt đầu chuỗi

Trường hợp 2: Khie những người Khác Đan mã CủA BạN

Cách viết bình luận trong python

NHận Xét nhs

^ Bắt đầu chuỗilập trình Python

Cách viết bình luận trong python

NHận Xét nhs

# This is a comment

Trong Python, các code bắt đầu bằng dấu thăng sẽ được bỏ qua khi compile, do vậy bạn có thể chèn comment vào bất kỳ đâu, ngay cả trong một dòng code khác.

print("This will run.")  # This won't run

Nhận xét nhiều dòng trong Python

Không giống như C, Java và Go, Python không có cách để viết nhận xét nhiều dòng, ví dụ:

# So you can't

just do this

in python

Trong ví dụ này, phần sau dấu thăng ở dòng đầu tiên sẽ được chương trình bỏ qua, hai dòng còn lại sẽ gây ra lỗi cú pháp cho chương trình. Mặc dù Python không có chức năng nhận xét nhiều dòng, nhưng có hai cách để bạn có thể thêm nhiều dòng comment.

Cách đầu tiên là nhấn phím  return sau mỗi dòng, một dấu thắng mới sẽ xuất hiện và bạn có thể thêm comment từ đó. Ví dụ:

defmultiline_example(): multiline_example():

    # This is a pretty good example  # This is a pretty good example

    # of how you can spread comments

    # over multiple lines in Python

Cách khác để viết comment nhiều dòng là sử dụng bộ ba dấu ngoặc kép như sau:

"""

If I really hate pressing `enter` and

typing all those hash marks, I could

just do this instead

"""

If I really hate pressing `enter` and

typing all those hash marks, I couldFlask là gì? Giới thiệu về Flask của Python

just do this instead

Về mặt kỹ thuật, đây không phải là một comment, nó là một chuỗi không được gán cho bất kỳ biến nào, vì vậy chương trình sẽ không gọi hoặc tham chiếu nó. Do vậy, nó có thể hoạt động như một comment.

>>> Xem thêm: Flask là gì? Giới thiệu về Flask của Python

Việc gõ dấu thăng để thêm comment trong Python có thể là một thao tác dư thừa và nhàm chán. Do vậy, bạn có thể sử dụng một số thủ thuật để tăng tốc khi bổ sung các comment. 

Một trong những điều đầu tiên bạn có thể làm là sử dụng nhiều con trỏ. Giữ phím Ctrl hoặc Cmd khi nhấp chuột trái và bạn sẽ thấy các dòng nhấp nháy trên màn hình chính của mình như sau:

Phím tắt để sử dụng comment trong Python

Cách này sẽ vô cùng hữu dụng khi bạn cần comment cùng một ý ở nhiều vị trí khác nhau.

Nếu nhận xét mà bạn thêm vào chương trình quá dài, trình soạn thảo văn bản sẽ cung cấp cho bạn tùy chọn để thu gọn chúng bằng cách sử dụng mũi tên xuống nhỏ ở phía bên trái:

Chỉ cần nhấp vào mũi tên để ẩn các nhận xét. Việc này sẽ khiến code của bạn trông ngắn gọn hơn với các nhận xét được viết trải dài trên nhiều dòng và chiến phần lớn thời gian chạy của chương trình.

Cách ẩn comment trong Python

Kết hợp các mẹo trên, code của bạn sẽ trở nên nhanh chóng, dễ dàng và hiệu quả hơn. www.t3h.edu.vn