Làm thế nào để trích xuất N từ đầu tiên của mỗi đoạn trong một văn bản? [đóng cửa]


-1

Bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể trích xuất N (ví dụ 30) từ đầu tiên của mỗi đoạn trong một văn bản không? Có lẽ với một regex?


1
Bạn đang sử dụng hệ điều hành nào? "Văn bản" của bạn có nghĩa là đây là một .txttệp văn bản ( ) đơn giản hoặc một cái gì đó phức tạp hơn như một .dochoặc pdf? Các đoạn văn được phân tách bằng một dòng trống? Họ có thụt lề không? Bạn có thể gửi một ví dụ về văn bản bạn sẽ làm việc với?
terdon

Regex là công nghệ bạn cần, nhưng nó sẽ cần một công cụ hỗ trợ nó. (Notepad ++, PHP, JavaScript, SED, v.v.)
Brian Adkins

Câu trả lời:


1

Như tôi đã nói trong nhận xét của tôi, rất nhiều thông tin quan trọng bị thiếu. Phần sau đây sẽ trích xuất 30 từ đầu tiên của mỗi đoạn từ một tệp văn bản đơn giản và sẽ hoạt động như trong bất kỳ * nix nào (Linux, OSX, Unix etx).

Ví dụ, tôi sẽ lưu văn bản này dưới dạng file.txt:

Lorem ipsum dolor ngồi amet, consitetur adipiscing elit. Nulla tại diam Vendo turpis dictum porttitor. Nunc velit massa, porttitor ngồi amet rutrum vel, invdiet eget sem. Pellentesque một porttitor neque elit fringilla Pretium. Sed sed felis quam. Pellentesque pellentesque lorem non Libero feugiat sollicitudin. Trong utel hậu quả felis. Phasellus sed arcu mi, vitae dictum arcu. Quisque speechus massa, tempus vitae Elementum nec, adipiscing ut risus.

Donec ở lacus urna, sed dictum speechus. Donec pharetra quam sed augue ornare aliquam. Aenean mollis velit eu justo scelerisque Elementum. Aenean tại lorem tại elit vestibulum malesuada. Aliquam sollicitudin volutpat massa et convallis. Ut eget ipsum vitae dolor ullamcorper consectetur. Class apt taciti sociosqu ad litora torquent per conubia nostra, per inosos himenaeos. Quisque elit nisi, volutpat quis malesuada ac, condimentum in quam. Morbi sagittis varius felis trong aliquam. Nullam interdum tạm thời lorem một bibendum. Cras lacinia rhoncus massa ac tạm thời.

Pellentesque fringilla, ante a hendrerit iaculis, mauris sem placerat felis, vitae ultrices nisl lorem ac ligula. Sed viverra nunc quis dui dictum a porta Tellus sempre. Aenean felis sapien, dictum et luctus quis, mattis tại massa. Nam lacus magna, suscipit tại consectetur ut, nhuyễn thể ở sem. Nam euismod mi a nulla rutrum placerat. Nulla dignissim preferisis turpis et faucibus. Donec Libero eros, venenatis congue volutpat id, fringilla in felis. Ut Vulputate, Tellus sed malesuada varius, dolor ligula Elementum leo, eu faucibus nulla erat at nisi.

Aliquam erat volutpat. Nulla confallis, leo ngồi amet placerat lacinia, nisl speechus TIME mi, id pharetra ipsum sapien varius nulla. Nam mollis, nulla tại molestie gravida, neque Libero resultat odio, nec aliquam Tellus arcu ullamcorper quam. Etiam a ligula nec augue dignissim Elementum. Lorem ipsum dolor ngồi amet, consitetur adipiscing elit. Maecenas preferisis hendrerit sodales. Sed lobortis tincidunt accumsan. Trong nunc massa, varius in scriptsicula at, placerat ngồi amet elit.

Fusce sed dui ante. Mauris purus est, rhoncus in cursus ngồi amet, Pretium porttitor magna. Sed dapibus, nisl in hendrerit hendrerit, purus Libero integsan speechus, at gravida erat sem a ligula. Phasellus accumsan est non magna sagittis iaculis a eget elit. Vestibulum posuere massa quis neque pharetra tại Elementum justo condimentum. Donec malesuada enim một nhạc trưởng nulla mattis. Morbi scelerisque, neque hendrerit lobortis eleifend, turpis quam adipiscing arcu, convallis mergsan speechus neque vitae eros. Maecenas sapien magna, fringilla eu pharetra hendrerit, varius vitae turpis.

Chạy tập lệnh Perl nhỏ này sẽ in 30 từ đầu tiên của mỗi đoạn (các đoạn cần các dòng trống giữa chúng):

$ perl -e 'while(<>){
     chomp; $par.=$_; 
     if (/^\s*$/){
        @a=split(/\s/,join("",$par)); 
        print "@a[0..29]\n\n";
        $par="";
        next;
     }
   } 
 @a=split(/\s/,join("",$par)); 
 print "@a[0..29]\n";' file.txt | fold -s

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla at diam commodo 
turpis dictum porttitor. Nunc velit massa, porttitor sit amet rutrum vel, 
imperdiet eget sem. Pellentesque a neque porttitor

Donec in lacus urna, sed dictum lectus. Donec pharetra quam sed augue ornare 
aliquam. Aenean mollis velit eu justo scelerisque elementum. Aenean at lorem at 
elit vestibulum malesuada. Aliquam sollicitudin

Pellentesque fringilla, ante a hendrerit iaculis, mauris sem placerat felis, 
vitae ultrices nisl lorem ac ligula. Sed viverra nunc quis dui dictum a porta 
tellus semper. Aenean felis sapien, dictum

Aliquam erat volutpat. Nulla convallis, leo sit amet placerat lacinia, nisl 
lectus tempor mi, id pharetra ipsum sapien varius nulla. Nam mollis, nulla at 
molestie gravida, neque libero consequat odio,

Fusce sed dui ante. Mauris purus est, rhoncus in cursus sit amet, pretium 
porttitor magna. Sed dapibus, nisl in hendrerit hendrerit, purus libero 
accumsan lectus, at gravida erat sem a

Có nhiều cách để làm điều này, một số đơn giản hơn một số phức tạp hơn. Nếu bạn cập nhật câu hỏi của bạn với yêu cầu cụ thể của bạn, tôi sẽ cập nhật câu trả lời của tôi.


0

Trong trình soạn thảo văn bản Sublime Text 2, bạn có thể sử dụng biểu thức chính quy sau đây để khớp 30 từ đầu tiên của mỗi đoạn trong một tệp văn bản thuần túy:

^((([^ \n]+) ?){1,30})

Ảnh chụp màn hình

Để loại bỏ mọi thứ khác, tìm kiếm ^((([^ \n]+) ?){1,30}).*thay thế và thay thế bằng $1. Điều này loại bỏ mọi thứ sau 30 từ đầu tiên trong mỗi đoạn.


Điều đó giả định rằng tất cả các đoạn bao gồm một dòng duy nhất không có \nquyền?
terdon

@terdon Đúng. Đây là một hạn chế so với các lệnh văn bản khác của ST2 ( Mở rộng lựa chọn thành Đoạn văn , Đoạn kết thúc , v.v.).
Daniel Beck

0

Như terdon chỉ ra, vấn đề của bạn khá mơ hồ được chỉ định. Nếu chúng tôi giả sử rằng "một văn bản" chứa các đoạn được phân tách bằng các dòng trống và "một từ" là một chuỗi các ký tự từ được định nghĩa trong hương vị regex đang được sử dụng, ví dụ sau (trong Python) có thể giúp bạn bắt đầu (văn bản từ đây ):

>>> import re
>>> pattern = r"(?:^|\n\n)((?:\W*\w+){,30})"
>>> for x in re.findall(pattern, text):
...     print(x)
...     print("---")
... 
Loop quantum gravity (LQG) is a theory that attempts to describe the
quantum properties of gravity. It is also a theory of quantum space
and quantum time, because, as discovered
---
More precisely, space can be viewed as an extremely fine fabric or
network "woven" of finite loops. These networks of loops are called
spin networks. The evolution of a spin
---
Today LQG is a vast area of research, developed in several directions,
which involves about 50 research groups world wide.[1] They all share
the basic physical assumptions and the
---
Several research directions study the physical consequences of the
theory. Among these, the most developed is the application of LQG to
cosmology, called Loop quantum cosmology (LQC). LQC applies LQG
---
>>> 

Regex được sử dụng trong đoạn mã trên:

(?:^|\n\n)((?:\W*\w+){,30})

... có vài phần. Đầu tiên, (?:^|\n\n)khớp với phần đầu của văn bản ^hoặc một cặp dòng mới \n\n(một dòng trống, nói cách khác). Sau đó, một chuỗi gồm 0 hoặc nhiều ký tự không phải từ được \W*theo sau bởi một hoặc nhiều ký tự từ \w+được khớp giữa 0 và 30 lần {,30}. Các (?:... )ngoặc nhóm các phần khác nhau của regex mà không cho phép họ được "bắt" bởi re.findall(), và trần (... )ngoặc báo hiệu rằng đây là một phần của regex để được chụp.

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.