Dấu ngoặc lồng nhau regex trong Python

Khi bạn đang làm việc với dữ liệu phức tạp, bạn có thể dễ dàng thấy mình phải trích xuất nhiều lớp thông tin, điều này có thể dẫn đến các nhóm lồng nhau. Nói chung, kết quả của các nhóm được chụp theo thứ tự mà chúng được xác định [theo thứ tự bằng dấu ngoặc đơn mở]

Lấy ví dụ từ bài học trước, lấy tên tệp của tất cả các tệp hình ảnh bạn có trong một danh sách. Nếu mỗi tệp hình ảnh này có một số ảnh liên tiếp trong tên tệp, bạn có thể trích xuất cả tên tệp và số ảnh bằng cách sử dụng cùng một mẫu bằng cách viết một biểu thức như ^[IMG[\d+]]\. png$ [sử dụng dấu ngoặc đơn lồng nhau để chụp các chữ số]

Các nhóm lồng nhau được đọc từ trái sang phải trong mẫu, với nhóm chụp đầu tiên là nội dung của nhóm dấu ngoặc đơn đầu tiên, v.v.

Đối với các chuỗi sau, hãy viết một biểu thức khớp và nắm bắt cả ngày đầy đủ cũng như năm của ngày

Cho một chuỗi

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
7. Làm cách nào để tìm chuỗi con
s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
0 giữa dấu ngoặc đơn mở và dấu ngoặc đơn đóng?

Xem xét các ví dụ sau

Input:     'Learn Python [not C++]'
Output:  'not C++'

Input:     'function[a, b, c, d]'
Output:  'a, b, c, d'

Input:     '[a+[b+c]]'
Output:  'a+[b+c]'

Phương pháp 1. cắt lát và str. tìm thấy[]

Cách đơn giản nhất để trích xuất chuỗi giữa hai dấu ngoặc đơn là sử dụng phép cắt và

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
1. Đầu tiên, tìm các chỉ số của lần xuất hiện đầu tiên của dấu ngoặc đơn mở và đóng. Thứ hai, sử dụng chúng làm chỉ mục lát cắt để lấy chuỗi con giữa các chỉ mục đó như vậy.
s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
2

Đây là một ví dụ đơn giản

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]

Kết quả là chuỗi

'not C++'

Chỉ mục bắt đầu của thao tác cắt được tăng thêm một để tránh bao gồm dấu ngoặc đơn mở trong chuỗi kết quả. Nếu bạn cần xem lại nhanh cách cắt lát, vui lòng xem video giải thích sau

Hướng dẫn cơ bản để cắt lát trong Python


Xem video này trên YouTube

Phương pháp 2. Cắt và rfind[]

Ngoài ra, bạn cũng có thể sử dụng phương pháp

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
3 để tìm kiếm dấu ngoặc đơn đóng từ bên phải thay vì bên trái để tạo kết quả đầu ra có ý nghĩa hơn cho các dấu ngoặc đơn lồng nhau

s = '[Learn Python [not C++]]'

print[s[s.find['[']+1:s.find[']']]]
# Learn Python [not C++

print[s[s.find['[']+1:s.rfind[']']]]
# Learn Python [not C++]

Nếu dấu ngoặc đóng không tồn tại, đầu ra của phương thức

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
4 là -1, có nghĩa là nó cắt hết sang bên phải nhưng không bao gồm ký tự cuối cùng của chuỗi

Điều này được minh họa ở đây

s = 'Learn Python [not C++'
result = s[s.find['[']+1:s.find[']']]
print[result]

Rõ ràng, đây không phải là mục tiêu của hoạt động. Vì vậy, chúng ta có thể làm tốt hơn?

Đúng. Regex để giải cứu

Phương pháp 3. Tìm tất cả các lần xuất hiện với lại. tìm tất cả []

Để tìm tất cả các chuỗi nằm giữa hai dấu ngoặc đơn, hãy gọi hàm

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
5 và chuyển mẫu
s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
6 làm đối số thứ nhất và chuỗi cần tìm làm đối số thứ hai

  • Các. *?
  • Phần
    s = 'Learn Python [not C++]'
    result = s[s.find['[']+1:s.find[']']]
    print[result]
    7 khớp với dấu ngoặc đơn mở và đóng. Bạn cần thoát khỏi các ký tự trong dấu ngoặc đơn để nói với công cụ biểu thức chính quy rằng bạn không muốn nó cho rằng đó là hoạt động của nhóm biểu thức chính quy cũng bắt đầu bằng dấu ngoặc đơn
Input:     'Learn Python [not C++]'
Output:  'not C++'

Input:     'function[a, b, c, d]'
Output:  'a, b, c, d'

Input:     '[a+[b+c]]'
Output:  'a+[b+c]'
3

Đầu ra là danh sách các trận đấu

Input:     'Learn Python [not C++]'
Output:  'not C++'

Input:     'function[a, b, c, d]'
Output:  'a, b, c, d'

Input:     '[a+[b+c]]'
Output:  'a+[b+c]'
4

Bạn có thể xem video sau giải thích hàm

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
8

Python Regex Findall[]


Xem video này trên YouTube

Nhưng nếu bạn có dấu ngoặc đơn lồng nhau trong chuỗi

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
9 thì sao?

Input:     'Learn Python [not C++]'
Output:  'not C++'

Input:     'function[a, b, c, d]'
Output:  'a, b, c, d'

Input:     '[a+[b+c]]'
Output:  'a+[b+c]'
8

Hãy xem xét một giải pháp nâng cao hơn mà tôi đã nghĩ ra

Phương pháp 4. Tìm tất cả các lần xuất hiện trong chuỗi có dấu ngoặc đơn lồng nhau

Để tìm tất cả các lần xuất hiện ngay cả trong một chuỗi có dấu ngoặc đơn lồng nhau, bạn có thể tìm kiếm liên tiếp tất cả các chuỗi con bắt đầu từ một chỉ mục bắt đầu nhất định trong một vòng lặp for

Input:     'Learn Python [not C++]'
Output:  'not C++'

Input:     'function[a, b, c, d]'
Output:  'a, b, c, d'

Input:     '[a+[b+c]]'
Output:  'a+[b+c]'
9

Điều này thực hiện các bước sau

  • Tạo một tập hợp trống để hợp nhất tất cả các chuỗi phù hợp vào đó nhưng tránh trùng lặp
  • Lặp lại tất cả các chỉ số bắt đầu từ 0 đến độ dài của chuỗi được tìm kiếm, trừ đi một
  • Tạo một chuỗi con bằng cách sử dụng cắt lát
    'not C++'
    1 để tìm kiếm các dấu ngoặc đơn kèm theo
  • Tìm các chuỗi tiếp theo được đặt trong ngoặc đơn bằng cách sử dụng
    'not C++'
    2 và thêm chúng vào tập hợp

Tóm lược

Cách đơn giản nhất để trích xuất chuỗi giữa hai dấu ngoặc đơn là sử dụng phép cắt và

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
1. Đầu tiên, tìm các chỉ số của lần xuất hiện đầu tiên của dấu ngoặc đơn mở và đóng. Thứ hai, sử dụng chúng làm chỉ mục lát cắt để lấy chuỗi con giữa các chỉ mục đó như vậy.
s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
2

Ngoài ra, bạn cũng có thể sử dụng phương pháp

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
3 để tìm kiếm dấu ngoặc đơn đóng từ bên phải thay vì bên trái để tạo kết quả đầu ra có ý nghĩa hơn cho các dấu ngoặc đơn lồng nhau

Để tìm tất cả các chuỗi nằm giữa hai dấu ngoặc đơn, hãy gọi hàm

s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
5 và chuyển mẫu
s = 'Learn Python [not C++]'
result = s[s.find['[']+1:s.find[']']]
print[result]
6 làm đối số thứ nhất và chuỗi cần tìm làm đối số thứ hai

Để tìm tất cả các lần xuất hiện ngay cả trong một chuỗi có dấu ngoặc đơn lồng nhau, bạn có thể tìm kiếm liên tiếp tất cả các chuỗi con bắt đầu từ một chỉ mục bắt đầu nhất định trong một vòng lặp for

Regex hài hước

Chờ đã, quên thoát khỏi một không gian. Weeeeee[taptaptap]eeeeee. [nguồn]

Khóa học Python Regex

Các kỹ sư của Google là những bậc thầy về biểu thức chính quy. Công cụ tìm kiếm Google là một công cụ xử lý văn bản khổng lồ trích xuất giá trị từ hàng nghìn tỷ trang web.   

Các kỹ sư của Facebook là những bậc thầy về biểu thức chính quy. Các mạng xã hội như Facebook, WhatsApp và Instagram kết nối con người qua tin nhắn văn bản.  

Các kỹ sư của Amazon là những bậc thầy về biểu thức chính quy. Gã khổng lồ thương mại điện tử vận ​​chuyển sản phẩm dựa trên mô tả sản phẩm bằng văn bản. Biểu thức chính quy thống trị trò chơi khi xử lý văn bản đáp ứng khoa học máy tính.  

Nếu bạn cũng muốn trở thành bậc thầy về biểu thức chính quy, hãy xem khóa học Python regex toàn diện nhất hành tinh

Chris

Trong khi làm việc với tư cách là một nhà nghiên cứu trong các hệ thống phân tán, Dr. Christian Mayer tìm thấy tình yêu của mình với việc dạy sinh viên khoa học máy tính

Để giúp sinh viên đạt được mức độ thành công Python cao hơn, anh ấy đã thành lập trang web giáo dục lập trình Finxter. com. Ông là tác giả của cuốn sách lập trình nổi tiếng Python One-Liners [NoStarch 2020], đồng tác giả của loạt sách tự xuất bản Coffee Break Python, người đam mê khoa học máy tính, cộng tác viên tự do và chủ sở hữu của một trong 10 blog Python lớn nhất thế giới

Niềm đam mê của anh ấy là viết, đọc và mã hóa. Nhưng niềm đam mê lớn nhất của anh ấy là phục vụ các lập trình viên đầy tham vọng thông qua Finxter và giúp họ nâng cao kỹ năng của mình. Bạn có thể tham gia học viện email miễn phí của anh ấy tại đây

S+ trong regex python là gì?

Mặt khác, \S+ [chữ hoa S ] khớp với bất kỳ thứ gì KHÔNG khớp với \s , i. e. , không phải khoảng trắng . Trong regex, ký tự meta chữ hoa biểu thị nghịch đảo của ký tự chữ thường, ví dụ: \w đối với ký tự từ và \W đối với ký tự không phải từ; .

Làm cách nào để lấy một phần của chuỗi giữa hai dấu ngoặc trong Python?

Phương pháp 1. cắt lát và str. Cách đơn giản nhất để trích xuất chuỗi giữa hai dấu ngoặc đơn là sử dụng slicing và string. tìm[] . Đầu tiên, tìm các chỉ số của lần xuất hiện đầu tiên của dấu ngoặc đơn mở và đóng. Thứ hai, sử dụng chúng làm chỉ mục lát cắt để lấy chuỗi con giữa các chỉ mục đó như vậy. s[s.

Chủ Đề