Biểu thức chính quy tìm thấy các từ giống nhau trong các từ 'n' của nhau


2

Tôi đang cố gắng kết hợp một tìm kiếm biểu thức chính quy tìm thấy bất kỳ hai (hoặc nhiều) từ nằm trong n (ví dụ: nhiều hơn 1, ít hơn 5) từ của nhau. Mục tiêu là tìm kiếm trên một văn bản văn xuôi và tìm thấy sự lặp lại không cần thiết của các từ gần nhau.

Ví dụ: trong văn bản sau, tìm kiếm sẽ xác định "gói:"

Người đưa thư giao một gói, và gói rất nặng.

Thách thức là hai từ có thể là bất kì hai từ, nhưng phải là tương tự hai từ. Tôi đã cố gắng tìm ra cách để làm việc với * hoặc là + (Tôi khá mới đối với các biểu thức thông thường), nhưng tất nhiên, các ký tự đại diện sẽ khớp với mọi từ, vì vậy chúng không hoạt động. Có cấu trúc tìm kiếm nào không $1 within n of $1 Điều đó sẽ dịch sang regex?

Câu trả lời:


1

Tôi không nghĩ rằng một regex là những gì bạn cần ở đây - bạn không thể diễn đạt điều đó, trừ khi bạn biết các từ trước đó.

Vì vậy, tôi đoán bạn có thể tiếp tục và phân tích từng từ trong văn bản (ví dụ: sắp xếp, sau đó xóa các bản sao). Sau đó, bạn chạy biểu thức chính quy sau, cho mỗi từ được tìm thấy (ở đây, từ này là foo ):

\bfoo\W+(?:\w+\W+){1,5}?foo\b

Đây, \b là một ranh giới từ. Sau đó, bạn phù hợp với từ thực tế. Sau đó, \W là bất kỳ ký tự không từ, nhiều lần. Bây giờ bạn bắt đầu một nhóm (bao quanh bởi () ), có thể xảy ra 1 đến 5 lần ( {1,5} ). Nhóm sẽ không bị bắt ( ?: ).

Xem một ví dụ trong hành động ở đây .


Tuyệt diệu. Hãy để tôi chắc chắn rằng tôi hiểu điều này một cách chính xác. Ý tưởng sẽ là sử dụng một cái gì đó như tr -s '[[:punct:][:space:]]' '\n' < file phân chia một tập tin thành các từ (từ stackoverflow.com/questions/15501652/ ) và đường ống xuyên qua sort -u. Sau đó, bạn có thể sử dụng tập lệnh để lặp lại từng từ / mục từ đầu ra thành biểu thức chính quy ở trên và in mọi kết quả trả về True. Tôi sẽ thử và kiểm tra điều này vào ngày mai; nên khá dễ dàng để viết một tập lệnh hoặc plugin chăm sóc nó.
zoned post meridiem

Một cái gì đó như thế, yeah! Mặc dù tất nhiên cũng cần phải kiểm tra trường hợp không nhạy cảm. Nhưng bạn có thể làm điều đó bằng cách hạ thấp văn bản đầu vào.
slhck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.