Ranh giới từ regex Python

Đôi khi bạn muốn tìm một từ, không phải chuỗi con là một phần của từ lớn hơn. Sử dụng \b để khớp với ranh giới từ. Thông thường ranh giới từ là khoảng trắng [khoảng trống, tab và một vài ký tự khác]. Nhưng ranh giới từ cũng bao gồm phần đầu và phần cuối của dòng, các trường hợp dễ bị bỏ qua khi tìm kiếm trong tệp văn bản

Để khớp với ranh giới không phải từ, hãy sử dụng \B trong biểu thức. Để tìm chuỗi con cat được nhúng trong một từ khác, hãy sử dụng \Bcat\B


Hãy cẩn thận khi cố khớp các ranh giới từ trong Python bằng cách sử dụng các biểu thức chính quy. Bạn phải chắc chắn thoát khỏi chuỗi khớp hoặc sử dụng chuỗi thô

ranh giới từ

Ranh giới từ là một cách tuyệt vời để thực hiện tìm kiếm cụm từ thông dụng cho toàn bộ từ trong khi tránh khớp một phần. Chẳng hạn, tìm kiếm cụm từ thông dụng “the” sẽ khớp với cả từ “the” và phần đầu của từ “thesaurus”

>>> import re
>>> re.match["the", "the"]
# matches
>>> re.match["the", "thesaurus"]
# matches 

Trong một số trường hợp, bạn có thể muốn chỉ khớp từ “the” chứ không phải khi nó được nhúng trong một từ khác

Cách khớp ranh giới từ là với '\ b', như được mô tả trong tài liệu Python. Tôi đã lãng phí vài phút vật lộn với việc cố gắng làm cho nó hoạt động

>>> re.match["\bthe\b", "the"]
# no match

Hóa ra \b cũng được sử dụng làm trình tự điều khiển xóa lùi. Do đó, để công cụ biểu thức chính quy diễn giải chính xác ranh giới từ, bạn cần thoát chuỗi

>>> re.match["\\bthe\\b", "the"]
# match

Bạn cũng có thể sử dụng chuỗi ký tự thô và tránh dấu gạch chéo ngược kép

>>> re.match[r"\bthe\b", "the"]
# match

Trong trường hợp bạn chưa từng thấy tiền tố chuỗi thô trước đây, thì đây là tài liệu liên quan

Các chuỗi ký tự có thể tùy chọn được bắt đầu bằng một chữ cái 'r' hoặc 'R';

Phần kết luận

Đảm bảo rằng bạn đã quen thuộc với các chuỗi thoát cho chuỗi trong Python, đặc biệt nếu bạn đang xử lý các biểu thức chính quy có các ký tự đặc biệt có thể xung đột. Tài liệu Java cho các biểu thức chính quy làm cho cảnh báo này rõ ràng hơn một chút so với Python

Ví dụ: chuỗi ký tự “\b” khớp với một ký tự xóa lùi khi được diễn giải dưới dạng biểu thức chính quy, trong khi “\\b” khớp với ranh giới từ

Cả mẫu và chuỗi được tìm kiếm đều có thể là chuỗi Unicode [] cũng như chuỗi 8 bit []. Tuy nhiên, không thể trộn lẫn chuỗi Unicode và chuỗi 8 bit. nghĩa là bạn không thể khớp một chuỗi Unicode với một mẫu byte hoặc ngược lại;

Biểu thức chính quy sử dụng ký tự gạch chéo ngược [_______4_______4] để biểu thị các dạng đặc biệt hoặc để cho phép sử dụng các ký tự đặc biệt mà không cần gọi ý nghĩa đặc biệt của chúng. Điều này xung đột với việc Python sử dụng cùng một ký tự cho cùng một mục đích trong chuỗi ký tự; . Ngoài ra, xin lưu ý rằng bất kỳ chuỗi thoát không hợp lệ nào trong cách sử dụng dấu gạch chéo ngược trong chuỗi ký tự của Python hiện tạo ra một và trong tương lai, điều này sẽ trở thành một. Hành vi này sẽ xảy ra ngay cả khi nó là một chuỗi thoát hợp lệ cho một biểu thức chính quy

Giải pháp là sử dụng ký hiệu chuỗi thô của Python cho các mẫu biểu thức chính quy; . Vì vậy,

result = re.match[pattern, string]
1 là chuỗi hai ký tự chứa
prog = re.compile[pattern]
result = prog.match[string]
4 và
result = re.match[pattern, string]
3, trong khi
result = re.match[pattern, string]
4 là chuỗi một ký tự chứa dòng mới. Thông thường các mẫu sẽ được thể hiện bằng mã Python bằng cách sử dụng ký hiệu chuỗi thô này

Điều quan trọng cần lưu ý là hầu hết các thao tác biểu thức chính quy đều có sẵn dưới dạng các hàm và phương thức cấp mô-đun trên. Các hàm là lối tắt không yêu cầu bạn biên dịch đối tượng biểu thức chính quy trước, nhưng bỏ lỡ một số tham số tinh chỉnh

Xem thêm

Mô-đun biểu thức chính quy của bên thứ ba, có API tương thích với mô-đun thư viện chuẩn, nhưng cung cấp chức năng bổ sung và hỗ trợ Unicode kỹ lưỡng hơn

Cú pháp biểu thức chính quy

Một biểu thức chính quy [hoặc RE] chỉ định một tập hợp các chuỗi phù hợp với nó;

Các biểu thức chính quy có thể được nối để tạo thành các biểu thức chính quy mới; . Nói chung, nếu một chuỗi p khớp với A và một chuỗi q khác khớp với B, thì chuỗi pq sẽ khớp với AB. Điều này giữ trừ khi A hoặc B chứa các hoạt động ưu tiên thấp; . Do đó, các biểu thức phức tạp có thể dễ dàng được xây dựng từ các biểu thức nguyên thủy đơn giản hơn như các biểu thức được mô tả ở đây. Để biết chi tiết về lý thuyết và cách thực hiện các biểu thức chính quy, hãy tham khảo sách Friedl hoặc hầu hết mọi sách giáo khoa về xây dựng trình biên dịch

Sau đây là giải thích ngắn gọn về định dạng của biểu thức chính quy. Để biết thêm thông tin và trình bày nhẹ nhàng hơn, hãy tham khảo

Biểu thức chính quy có thể chứa cả ký tự đặc biệt và ký tự thông thường. Hầu hết các ký tự thông thường, như

result = re.match[pattern, string]
6,
result = re.match[pattern, string]
7 hoặc
result = re.match[pattern, string]
8, là các biểu thức chính quy đơn giản nhất; . Bạn có thể nối các ký tự thông thường, do đó,
result = re.match[pattern, string]
9 khớp với chuỗi
>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
0. [Trong phần còn lại của phần này, chúng ta sẽ viết RE trong
>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
1, thường không có dấu ngoặc kép, và các chuỗi được khớp với nhau
>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
2. ]

Một số ký tự, như

>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
3 hoặc
>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
4, là đặc biệt. Các ký tự đặc biệt đại diện cho các lớp ký tự thông thường hoặc ảnh hưởng đến cách diễn giải các biểu thức chính quy xung quanh chúng

Các toán tử hoặc bộ định lượng lặp lại [_______17_______5,

>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
6,
>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
7,
>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
8, v.v.] không được lồng trực tiếp vào nhau. Điều này tránh sự mơ hồ với hậu tố sửa đổi không tham lam
>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
7 và với các công cụ sửa đổi khác trong các triển khai khác. Để áp dụng lần lặp lại thứ hai cho lần lặp lại bên trong, dấu ngoặc đơn có thể được sử dụng. Ví dụ: biểu thức
>>> re.split[r'[\W+]', '...words, words...']
['', '...', 'words', ', ', 'words', '...', '']
0 khớp với bất kỳ bội số nào của sáu ký tự
result = re.match[pattern, string]
7

Các ký tự đặc biệt là

>>> re.split[r'[\W+]', '...words, words...']
['', '...', 'words', ', ', 'words', '...', '']
2

[Chấm. ] Ở chế độ mặc định, ký tự này khớp với bất kỳ ký tự nào ngoại trừ ký tự xuống dòng. Nếu cờ đã được chỉ định, thì cờ này sẽ khớp với bất kỳ ký tự nào kể cả một dòng mới

>>> re.split[r'[\W+]', '...words, words...']
['', '...', 'words', ', ', 'words', '...', '']
4

[dấu mũ. ] Khớp với phần đầu của chuỗi và trong chế độ cũng khớp ngay sau mỗi dòng mới

>>> re.split[r'[\W+]', '...words, words...']
['', '...', 'words', ', ', 'words', '...', '']
6

Khớp với phần cuối của chuỗi hoặc ngay trước dòng mới ở cuối chuỗi và trong chế độ cũng khớp với trước một dòng mới.

>>> re.split[r'[\W+]', '...words, words...']
['', '...', 'words', ', ', 'words', '...', '']
8 khớp với cả 'foo' và 'foobar', trong khi biểu thức chính quy
>>> re.split[r'[\W+]', '...words, words...']
['', '...', 'words', ', ', 'words', '...', '']
9 chỉ khớp với 'foo'. Thú vị hơn, tìm kiếm
>>> re.split[r'\b', 'Words, words, words.']
['', 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split[r'\W*', '...words...']
['', '', 'w', 'o', 'r', 'd', 's', '', '']
>>> re.split[r'[\W*]', '...words...']
['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']
0 trong
>>> re.split[r'\b', 'Words, words, words.']
['', 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split[r'\W*', '...words...']
['', '', 'w', 'o', 'r', 'd', 's', '', '']
>>> re.split[r'[\W*]', '...words...']
['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']
1 khớp với 'foo2' bình thường, nhưng 'foo1' ở chế độ; . một ngay trước dòng mới và một ở cuối chuỗi

>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
5

Làm cho RE kết quả khớp với 0 hoặc nhiều lần lặp lại của RE trước đó, càng nhiều lần lặp lại càng tốt.

>>> re.split[r'\b', 'Words, words, words.']
['', 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split[r'\W*', '...words...']
['', '', 'w', 'o', 'r', 'd', 's', '', '']
>>> re.split[r'[\W*]', '...words...']
['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']
6 sẽ khớp với 'a', 'ab' hoặc 'a' theo sau bởi bất kỳ số nào của 'b'

>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
6

Làm cho RE kết quả khớp với 1 hoặc nhiều lần lặp lại của RE trước đó.

>>> re.split[r'\b', 'Words, words, words.']
['', 'Words', ', ', 'words', ', ', 'words', '.']
>>> re.split[r'\W*', '...words...']
['', '', 'w', 'o', 'r', 'd', 's', '', '']
>>> re.split[r'[\W*]', '...words...']
['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']
8 sẽ khớp với 'a' theo sau bởi bất kỳ số nào khác 0 của 'b';

>>> re.split[r'\W+', 'Words, words, words.']
['Words', 'words', 'words', '']
>>> re.split[r'[\W+]', 'Words, words, words.']
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split[r'\W+', 'Words, words, words.', 1]
['Words', 'words, words.']
>>> re.split['[a-f]+', '0a3B9', flags=re.IGNORECASE]
['0', '3', '9']
7

Làm cho RE kết quả khớp với 0 hoặc 1 lần lặp lại của RE trước đó.

>>> m = re.search[r'[?

Chủ Đề