Hướng dẫn python get text between two strings multiline - python lấy văn bản giữa hai chuỗi nhiều dòng

Tôi đang cố gắng để có được văn bản giữa "Phần kiểm tra: và phần sau phần của tôi

Tôi đã thử một số nỗ lực với các mẫu Regex khác nhau và tôi không đi đâu được.

Nếu tôi làm:

(?<=Test)(.*?)(?=

Sau đó, tôi nhận được phản hồi chính xác của:

' Section: '

Nhưng nếu tôi làm

(?<=Test)(.*?)(?=)

Tôi không nhận được kết quả. Kết quả phải là "Phần của tôi phần 2 của tôi"
MY SECTION 2
"

Tôi đã thử sử dụng Regex Multiline cũng không có kết quả.

Bất kỳ trợ giúp sẽ được đánh giá cao.

Nếu nó có vấn đề, tôi đang mã hóa trong Python 2.7.

Nếu một cái gì đó không rõ ràng, hoặc bạn cần thêm thông tin, xin vui lòng cho tôi biết.

Hướng dẫn python get text between two strings multiline - python lấy văn bản giữa hai chuỗi nhiều dòng

Falsetru

345K59 Huy hiệu vàng688 Huy hiệu bạc611 Huy hiệu Đồng59 gold badges688 silver badges611 bronze badges

Đã hỏi ngày 21 tháng 7 năm 2014 lúc 14:14Jul 21, 2014 at 14:14

Hướng dẫn python get text between two strings multiline - python lấy văn bản giữa hai chuỗi nhiều dòng

CodelikeBeakerCodelikeBeakerCodeLikeBeaker

Huy hiệu vàng 19.9K1376 Huy hiệu bạc13 gold badges76 silver badges106 bronze badges

1

Sử dụng cờ

(?<=Test)(.*?)(?=
9 hoặc
' Section: '
0. Hoặc dự phòng biểu thức chính quy với
' Section: '
1 để tạo
' Section: '
2 khớp với tất cả các ký tự (bao gồm cả dòng mới).

Không có cờ,

' Section: '
2 không khớp với Newline.

(?s)(?<=Test)(.*?)(?=)

Example:

>>> s = '''
''' >>> >>> import re >>> re.findall('(?<=Test)(.*?)(?=)', s) # without flags [] >>> re.findall('(?<=Test)(.*?)(?=)', s, flags=re.S) [' Section:
\n MY SECTION
\n MY SECTION 2
\n '] >>> re.findall('(?s)(?<=Test)(.*?)(?=)', s) [' Section:
\n MY SECTION
\n MY SECTION 2
\n ']

Đã trả lời ngày 21 tháng 7 năm 2014 lúc 14:17Jul 21, 2014 at 14:17

Falsetrufalsetrufalsetru

345K59 Huy hiệu vàng688 Huy hiệu bạc611 Huy hiệu Đồng59 gold badges688 silver badges611 bronze badges

1

Đã hỏi ngày 21 tháng 7 năm 2014 lúc 14:14

Test Section:([\S\s]*)

CodelikeBeakerCodelikeBeaker

Huy hiệu vàng 19.9K1376 Huy hiệu bạc change the last part as per your need.

Sử dụng cờ

(?<=Test)(.*?)(?=
9 hoặc
' Section: '
0. Hoặc dự phòng biểu thức chính quy với
' Section: '
1 để tạo
' Section: '
2 khớp với tất cả các ký tự (bao gồm cả dòng mới).

import re
p = re.compile(ur'Test Section:([\S\s]*)', re.MULTILINE)
test_str = u"..."

re.findall(p, test_str)

Không có cờ,

' Section: '
2 không khớp với Newline.

  Test Section:            'Test Section:'
  (                        group and capture to \1:
    [\S\s]*                  any character of: non-whitespace (all
                             but \n, \r, \t, \f, and " "), whitespace
                             (\n, \r, \t, \f, and " ") (0 or more
                             times (matching the most amount
                             possible))
  )                        end of \1
                      ''

Đã trả lời ngày 21 tháng 7 năm 2014 lúc 14:17Jul 21, 2014 at 14:19

Hướng dẫn python get text between two strings multiline - python lấy văn bản giữa hai chuỗi nhiều dòng

1

Để phù hợp với bất kỳ văn bản nào giữa hai chuỗi/mẫu với biểu thức thông thường trong Python bạn có thể sử dụng:text between two strings/patterns with a regular expression in Python you can use:

re.search(r'pattern1(.*?)pattern2', s).group(1)

Trong các phần tiếp theo, bạn sẽ thấy cách áp dụng trên bằng cách sử dụng một ví dụ đơn giản.

Trong ví dụ này, chúng tôi đang sử dụng bộ dữ liệu Kaggle. Nếu bạn muốn tìm hiểu thêm về cách đọc Kaggle dưới dạng dữ liệu gấu trúc, hãy kiểm tra bài viết này: Cách tìm kiếm và tải xuống bộ dữ liệu Kaggle xuống Pandas DataFrame

Để bắt đầu với một ví dụ đơn giản, hãy để có một văn bản tiếp theo:

Bước 1 Một số văn bản Bước 2 Thêm văn bản Bước 3 sau đó thêm văn bản

Và chúng tôi muốn trích xuất mọi thứ từ

' Section: '
4 và
' Section: '
5. Để làm như vậy, chúng tôi sẽ sử dụng nhóm Capture như:

(?<=Test)(.*?)(?=
0

result:

(?<=Test)(.*?)(?=
1

Làm thế nào nó hoạt động:

  • ' Section: '
    
    4 - Phù hợp với các ký tự Bước 1 theo nghĩa đen (trường hợp nhạy cảm)step 1 literally (case sensitive)
  • ' Section: '
    
    7 - ​​phù hợp với bất kỳ ký tự nào giữa thời gian bằng không và không giới hạn mở rộng khi cần thiết (lười biếng)
  • ' Section: '
    
    5 - Phù hợp với các ký tự Bước 2 theo nghĩa đen (trường hợp nhạy cảm)step 2 literally (case sensitive)

Tìm kiếm không lười biếng

Ví dụ trước sẽ dừng lại cho đến khi nó tìm thấy văn bản thỏa mãn nó. Nếu bạn thích trích xuất:

(?<=Test)(.*?)(?=
2

Sau đó, bạn cần thay đổi tìm kiếm thành:

(?<=Test)(.*?)(?=
3

Bước 2: Kết hợp văn bản giữa hai mẫu

Bây giờ chúng ta hãy nói rằng bạn muốn khớp với một mẫu và không cố định văn bản. Trong ví dụ này, chúng ta sẽ thấy cách trích xuất

' Section: '
9 theo sau là một chữ số:to match a pattern and not fixed text. In this example we will see how to extract
' Section: '
9 followed by a digit:

(?<=Test)(.*?)(?=
4

Vì vậy, có văn bản tiếp theo:

(?<=Test)(.*?)(?=
5

Chúng tôi sẽ trích xuất:

(?<=Test)(.*?)(?=
6

Làm thế nào nó hoạt động?

  • (?<=Test)(.*?)(?=)
    
    0 - Nhóm không bắt giữ -
    (?<=Test)(.*?)(?=)
    
    1 - Nó sẽ được khớp nhưng không được trích xuất
    • (?<=Test)(.*?)(?=)
      
      2 - Phù hợp với các ký tự theo nghĩa đen (trường hợp nhạy cảm) theo sau là một chữ số (tương đương với [0-9])step literally (case sensitive) followed by a digit (equivalent to [0-9])
  • ' Section: '
    
    7 - ​​Nhóm bắt đầu 1 - Chụp bất cứ thứ gì lười biếng
  • (?<=Test)(.*?)(?=)
    
    4 - Nhóm không bắt giữ
    • (?<=Test)(.*?)(?=)
      
      5 khớp với ký tự dòng mới

Bước 3: Kết hợp văn bản giữa hai mẫu lười biếng so với tham lam

Trong bước này, chúng tôi sẽ đưa ra một lời giải thích hơn cho trận đấu lười biếng vs tham lam. Sự khác biệt có thể được giải thích như:lazy vs greedy match. The difference can be explained as:

  • (?<=Test)(.*?)(?=)
    
    6 - lười biếngLazy
  • (?<=Test)(.*?)(?=)
    
    7 - tham lamGreedy

Vì vậy, hãy nói rằng chúng tôi có một danh sách các thư như:

| [Email & nbsp; được bảo vệ]; | [Email & nbsp; được bảo vệ]; | [Email & nbsp; được bảo vệ];

Nếu chúng ta thực hiện trích xuất tham lam giữa các chuỗi, chúng ta sẽ nhận được:greedy extraction between to strings we will get:

(?<=Test)(.*?)(?=
7

Kết quả sẽ chỉ là 1 trận đấu từ

(?<=Test)(.*?)(?=)
8 đầu tiên đến lần cuối
(?<=Test)(.*?)(?=)
9:

['[Email & nbsp; được bảo vệ]; | [Email & nbsp; được bảo vệ]; | [Email & nbsp; được bảo vệ] ']]

Trong khi nếu chúng ta thực hiện tìm kiếm lười biếng cho một văn bản giữa hai nền tảng thì chúng ta sẽ nhận được:lazy search for a text between two substrings then we will get:

(?<=Test)(.*?)(?=
8

3 chuỗi riêng biệt như:

['Một số văn bản', 'văn bản nhiều hơn', 'sau đó nhiều văn bản hơn']

Hướng dẫn python get text between two strings multiline - python lấy văn bản giữa hai chuỗi nhiều dòng

Làm cách nào để trích xuất văn bản giữa hai chuỗi trong Python?

Sử dụng LOP index () + để trích xuất chuỗi giữa hai chuỗi con.Trong đó, chúng tôi nhận được các chỉ số của cả hai chuỗi con bằng cách sử dụng index (), sau đó một vòng lặp được sử dụng để lặp trong chỉ mục để tìm chuỗi cần thiết giữa chúng. to extract string between two substrings. In this, we get the indices of both the substrings using index(), then a loop is used to iterate within the index to find the required string between them.

Làm thế nào để bạn đọc một chuỗi đa dòng trong Python?

Sử dụng phương thức str.SplitLines () để đọc từng dòng chuỗi đa dòng từng dòng, ví dụ:cho dòng trong multiline_str. splitlines() method to read a multiline string line by line, e.g. for line in multiline_str.

Làm thế nào để bạn xử lý một chuỗi dài trong Python?

Sử dụng dấu ngoặc đơn trong Python, bạn có thể tự do phá vỡ dòng trong ngoặc đơn ((), {}, []).Sử dụng quy tắc này, bạn có thể viết một chuỗi dài trên nhiều dòng với dấu ngoặc đơn thay vì dấu gạch chéo ngược. In Python, you can freely break the line in parentheses ( () , {} , [] ). Using this rule, you can write a long string on multiple lines with parentheses instead of backslashes.

Làm thế nào để bạn khớp một chuỗi trong regex?

Một biểu thức chính quy (Abbr. Regex) là một mẫu các ký tự được sử dụng để phù hợp với các kết hợp khác nhau của các chuỗi hoặc ký tự ...
\ w - khớp với bất kỳ ký tự nào ..
A {3} - khớp ba ký tự A liên tiếp ..
@gmail \ .com - khớp với một chuỗi theo nghĩa đen "@gmail.com", trong khi thoát khỏi.với một nhà điều hành \ ..

Tôi có bài kiểm tra sau (được định dạng giống như bên dưới):

My Class: TEST DATA
Test Section:
MY SECTION
MY SECTION 2
... My Class: TEST DATA
... Test Section:
... MY SECTION
... MY SECTION 2
...