Regex để trích xuất các từ trong chuỗi Python

Cho đến nay, bạn đã nhìn thấy văn bản rõ ràng. Nhưng trong thế giới hoang dã của tin nhắn trực tuyến và mạng xã hội, bạn phải đối phó với nhiều tiếng ồn hơn. Thẻ HTML khi bạn cạo một trang, biểu tượng cảm xúc trong tweet, dấu trọng âm bằng tiếng Pháp, URL và email ở mọi nơi, trong số những thứ khác. Bạn có thể cần phải thoát khỏi những

Hãy bắt đầu với một cái gì đó đơn giản nhưng hữu ích, trích xuất #hashtags từ kho văn bản truyền thông xã hội [tweet, Instagram, v.v. ]

Trích xuất Hashtags

Hãy tưởng tượng rằng bạn muốn trích xuất tất cả #hastags từ bộ sưu tập các tweet. Chính xác hơn, bạn muốn tìm tất cả các chuỗi bắt đầu bằng dấu # và giữa các ranh giới từ như khoảng trắng, tab, xuống dòng, v.v.

Để làm điều đó, bạn sử dụng thư viện Python  

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
0. Nó cho phép bạn

  • Xác định một mẫu chuỗi. Mẫu có thể phức tạp hơn hoặc ít hơn nhưng luôn chính xác

  • Thao tác trên các chuỗi phù hợp với mẫu. tìm kiếm, trích xuất, thay thế

Mã để tìm tất cả các thẻ bắt đầu bằng # từ một đoạn văn bản như sau

# the source text
text = ' _ _ _ _ _ .. '

# 1. import the regex library
import re

# 2. define the pattern
pattern = r'#\S+'


# 3. find all the strings that match the pattern with the findall method
re.findall[pattern, text]

Chúng ta sẽ quay lại định nghĩa của mẫu 

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
1 sau. Hiện tại, hãy áp dụng mã đó cho bộ sưu tập ba tweet

  • Cảnh #thu có #ngựa đẹp đến thăm tôi

  • Quán ăn yêu thích mới của tôi ở #liverpool. và ý tôi là tuyệt vời. #TheBrunchClub #bữa sáng #đồ ăn

  • #now Playing Chị em con trỏ - Dare Me. #thập niên 80 #disco #funk #radio

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]

Kết quả này trong

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']

Nó đã làm việc. Chúng tôi đã trích xuất tất cả các thẻ bắt đầu bằng # từ các tweet

Một chiến lược khác để trích xuất các thẻ bắt đầu bằng # có thể đơn giản là mã hóa văn bản và chỉ giữ lại các mã thông báo bắt đầu bằng #. Tuy nhiên, phương pháp này sẽ không thể áp dụng để phát hiện các mẫu chuỗi phức tạp hơn như email, URL, danh sách từ, v.v.

Trích xuất @Tên người dùng

Tên người dùng bắt đầu bằng ký hiệu @ có thể được trích xuất theo cách tương tự. Bạn chỉ phải thay dấu # bằng dấu @ trong định nghĩa của biểu thức chính quy

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]

Bạn lấy

['@openclassrooms', '@alexip']

Điều đó khá dễ dàng. Rốt cuộc, mẫu chỉ phải nhận ra ký tự đầu tiên của chuỗi

Xác định một Regex

Vậy regex là gì?

Regex là viết tắt của cụm từ thông dụng. Đó là một chuỗi các ký tự xác định mẫu tìm kiếm. Mẫu cho phép bạn khớp, trích xuất hoặc sửa đổi văn bản

Bạn đã thấy hai định nghĩa regex cho đến nay.

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
1  cho #hashtags và  
['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
3  cho @tên người dùng được sử dụng để trích xuất các thẻ bắt đầu bằng # và tên người dùng từ các tweet

Khi bạn đã xác định mẫu, hãy sử dụng mẫu đó để chuyển đổi văn bản. Thư viện 

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
4 của Python bao gồm ba chức năng chính sau

  • ['#autumn', '#horse']
    ['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
    ['#nowplaying', '#80s', '#disco', '#funk', '#radio']
    5, trả về danh sách các chuỗi khớp với mẫu.  

  • ['#autumn', '#horse']
    ['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
    ['#nowplaying', '#80s', '#disco', '#funk', '#radio']
    6, thay thế chuỗi chuỗi khớp với mẫu bằng chuỗi replace_with.  

  • ['#autumn', '#horse']
    ['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
    ['#nowplaying', '#80s', '#disco', '#funk', '#radio']
    7, trả về mẫu phù hợp cuối cùng với thông tin về vị trí bắt đầu và kết thúc của mẫu.  

Trong khi  

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
8  trả về một danh sách các chuỗi khớp, thì 
['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
9 và 
import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
0 trả về một đối tượng khớp khi tìm thấy mẫu hoặc Không có nếu không tìm thấy mẫu. Một đối tượng khớp bao gồm vị trí bắt đầu và kết thúc của mẫu trong chuỗi. Xem tài liệu regex để biết thêm thông tin

Hãy áp dụng hàm 

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
1 để xóa tất cả các thẻ HTML khỏi trang HTML

Xóa thẻ HTML

Giả sử bạn đã tải xuống một trang web và bạn muốn lấy văn bản ra khỏi trang mà không cần đánh dấu HTML. Bạn có thể sử dụng biểu thức chính quy cho điều đó bằng cách xác định một mẫu tìm thấy tất cả các chuỗi nằm giữa < và a >  

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
2

# the source text
text = ' _ _ _ _ _ .. '

# 1. import the regex library
import re

# 2. define the pattern
pattern = r'#\S+'


# 3. find all the strings that match the pattern with the findall method
re.findall[pattern, text]
8

Ví dụ, bạn có thể nhận được.

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
3

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
0

Mẫu trên, 

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
4 , có thể được sử dụng để loại bỏ

  • Các phương trình nội tuyến latex bắt đầu và kết thúc bằng

    import re
    
    text = 'Check out this new NLP course on @openclassrooms by @alexip'
        
    # change the pattern # -> @
    pattern = r'@\S+' 
    
    print[re.findall[pattern, text]]
    5 [bạn chỉ cần bỏ ký hiệu $ bằng cách thêm dấu gạch chéo \ trước ký hiệu $. \$]

  • Văn bản giữa các dấu ngoặc đơn như [âm nhạc] hoặc [vỗ tay], có thể tìm thấy trong phụ đề  

    import re
    
    text = 'Check out this new NLP course on @openclassrooms by @alexip'
        
    # change the pattern # -> @
    pattern = r'@\S+' 
    
    print[re.findall[pattern, text]]
    6

Trích xuất URL

Đối với ví dụ cuối cùng, hãy trích xuất các URL trong văn bản bằng cách sử dụng trang HTML thô của Wikipedia làm nội dung

Tất cả các URL đều bắt đầu bằng tên của giao thức [FTP, HTTP, v.v. ]. Chúng tôi sẽ tuân thủ các URL web đầy đủ tiêu chuẩn bắt đầu bằng  

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
7

Chúng tôi có thể thử thay thế # trong #hashtag như trước đó không?

Thật không may, điều đó sẽ không hoạt động tốt. Hashtags [và @usernames] thường được theo sau bởi dấu cách, tab hoặc xuống dòng. Trong trang HTML thô, phần cuối của URL có thể là dấu ngoặc kép " hoặc ký tự thẻ kết thúc >. Chúng ta cần chỉ định mẫu để nó biết tìm các ký tự kết thúc [",>,; ] chứ không chỉ các ký tự bắt đầu [#, @, http]

Để tìm URL, hãy sử dụng mẫu phức tạp hơn một chút này.

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
8

Hãy kiểm tra nó trên một số nội dung HTML

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
6

Thao tác này trả về danh sách tất cả 279 URL có trong trang Wikipedia cho Nhạc House. Chẳng hạn,  

import re

text = 'Check out this new NLP course on @openclassrooms by @alexip'
    
# change the pattern # -> @
pattern = r'@\S+' 

print[re.findall[pattern, text]]
9

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
8

Bạn có thể tìm hoặc thay thế tất cả các loại thành phần [email, dấu chấm câu, số, mã zip, số điện thoại, v.v. ] với các mẫu khác nhau

Bản tóm tắt các mẫu Regex chính

Đây là bảng các mẫu biểu thức chính quy hữu ích

yếu tố mục tiêu

Chuỗi mẫu

biểu thức chính quy

#hashtag

# ------

['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
9

@tên người dùng

@-----

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
0

email

---@---

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
1

url

http----

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
2

danh sách các từ

từ01, từ02, từ03

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
3

chấm câu

,. ;'"[]{}

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
4

chữ số

01234567890

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
5

thẻ html

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
6

cao su nội tuyến

$---$

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
7

Xây dựng các mẫu Regex

Như bạn có thể nhận thấy, chúng tôi đã giải thích rõ ràng cách tạo biểu thức chính quy. Có một vài lý do cho điều đó

Trước hết, regex có vẻ đáng sợ và việc bắt đầu với một số ví dụ sẵn có sẽ dễ dàng hơn. Thứ hai, việc xây dựng một mẫu biểu thức chính quy phù hợp có thể tốn nhiều thời gian với nhiều lần thử và sai. Trong thực tế, tôi thường google những gì tôi đang tìm kiếm, kết thúc trên Stack Overflow và nhanh chóng tìm thấy biểu thức chính quy đơn giản nhất hiện có. Sau đó, tôi kiểm tra biểu thức chính quy trên một số ví dụ, tránh nhiệm vụ phải tạo biểu thức chính quy của riêng mình

Vẫn rất hữu ích khi biết thêm về hoạt động bên trong của mẫu biểu thức chính quy

Biểu thức chính quy là một chuỗi bao gồm các ký tự biểu thị một tập hợp các thành phần, một số thành phần hoặc ranh giới thành phần

Các thành phần
  • []. một tập hợp các ký tự

  • a-z. chữ thường, chữ hoa A-Z hoặc À-ÖØ-öø-ÿ cho chữ có dấu

  • chữ số. \d. chữ số. Tương đương với [0-9]

  • \S bất kỳ ký tự nào không phải là ký tự khoảng trắng

  • \w ký tự từ, bao gồm cả số và dấu gạch dưới

  • \s ký tự khoảng trắng bao gồm trả về dòng, tab, khoảng trắng không ngắt, v.v.

sự lặp lại
  • +. 1 hoặc nhiều lần lặp lại

  • ?. 0 hoặc 1 lần lặp lại

  • *. 0 trở lên

ranh giới
  • \ b. chuỗi trống, nhưng chỉ ở đầu hoặc cuối của một từ, do đó, trình mã thông báo từ tiềm năng có thể là r'\b\w\b'

  • ^. từ đầu văn bản

  • $. cho đến khi kết thúc văn bản

Có một số trang web dành riêng cho việc xây dựng và thử nghiệm các mẫu biểu thức chính quy. Regex 101, được tìm thấy ở đây, là một ví dụ điển hình.  

Tại sao các mẫu biểu thức chính quy được xác định bằng một chuỗi đứng trước chữ r? . Trong chuỗi thô, các ký tự thoát như trả về dòng \n không được diễn giải, đó là lý do tại sao chuỗi thô được ưu tiên khi khai báo mẫu biểu thức chính quy. Để thấy sự khác biệt giữa một chuỗi và một chuỗi thô, hãy so sánh  

['@openclassrooms', '@alexip']
0  [sẽ in ra dòng trả về ] và  
['@openclassrooms', '@alexip']
1  [sẽ in ra \n]

Biên dịch trước một mẫu Regex

Bạn đã thấy các trường hợp trong đó biểu thức chính quy được định nghĩa là một chuỗi và được sử dụng trong các hàm     

['@openclassrooms', '@alexip']
2  và  
['#autumn', '#horse']
['#liverpool', '#TheBrunchClub', '#breakfast', '#food']
['#nowplaying', '#80s', '#disco', '#funk', '#radio']
8.  

Tuy nhiên, cũng có thể biên dịch trước mẫu biểu thức chính quy với 

['@openclassrooms', '@alexip']
4

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
8

Biên dịch trước regex sẽ tăng tốc đáng kể việc thực thi hàm. Đó là cách thực hành tốt khi xử lý khối lượng dữ liệu lớn

Còn việc cạo bằng Súp đẹp thì sao? . Nó hoạt động dựa trên việc tìm các thẻ HTML cụ thể và trích xuất thông tin được liên kết với nó. href  cho URL hoặc tên div cho nội dung, v.v. Nếu mẫu của bạn hoàn toàn dựa trên văn bản, regex sẽ nhanh hơn và cũng có thể phân tích cú pháp một trang. ;]

Regex là một công cụ mạnh mẽ được sử dụng trên nhiều ngôn ngữ [từ C, PHP, Java, Go, Julia , Haskell hoặc R] và thậm chí cả trên dòng lệnh. Mặc dù có một số biến thể nhỏ giữa các phiên bản regex nhưng tất cả chúng đều có chung định nghĩa mẫu

Trên dòng lệnh, regex được tích hợp mặc định trong hầu hết các lệnh. Ví dụ: để trích xuất tất cả email từ nhiều tệp văn bản trong một thư mục, hãy grep mẫu email để lấy danh sách

# the corpus of tweets
tweets = [
    'An #autumn scene showing a beautiful #horse coming to visit me.', 
    'My new favourite eatery in #liverpool and I mean superb! #TheBrunchClub #breakfast #food', 
    '#nowplaying Pointer Sisters - Dare Me | #80s #disco #funk #radio']
    
# and the hashtag extraction
import re
pattern = r'#\S+'
for text in tweets:
    print[re.findall[pattern, text]]
9

Hãy tóm tắt lại

  • Regex là một chuỗi ký tự xác định mẫu tìm kiếm có thể khớp, định vị và quản lý văn bản

  • Bạn có thể sử dụng biểu thức chính quy được xác định trước để trích xuất các thành phần văn bản đơn giản, chẳng hạn như tên người dùng hoặc thẻ bắt đầu bằng #. Trong chương này, bạn đã học một số mẫu phổ biến nhất và cách sử dụng chúng để trích xuất thông tin từ văn bản

  • Bạn cũng có thể sử dụng regex để dọn sạch văn bản bằng cách xóa các thẻ không mong muốn và các phần tử phức tạp hơn

  • Regex rất nhanh và có thể được sử dụng từ dòng lệnh trong hầu hết các ngôn ngữ lập trình.  

Điều này kết thúc Phần I của khóa học. Trong phần tiếp theo, bạn sẽ xem cách chuyển đổi văn bản thành số để sử dụng máy học.  

  • #

Tạo biểu mẫu từ độc đáo với SpaCy Đố. Tiền xử lý dữ liệu văn bản

1

2

Tạo
tài khoản OpenClassrooms

Chúng tôi rất vui khi thấy rằng bạn thích các khóa học của chúng tôi [đã xem 5 trang hôm nay]. Bạn có thể tiếp tục xem các khóa học của chúng tôi bằng cách trở thành thành viên của cộng đồng OpenClassrooms. Nó miễn phí

Bạn cũng sẽ có thể theo dõi tiến độ khóa học của mình, thực hành các bài tập và trò chuyện với các thành viên khác

Đăng ký Đăng nhập

Tiền xử lý dữ liệu văn bản

  1. Xây dựng đám mây từ đầu tiên của bạn
  2. Xóa các từ dừng khỏi một khối văn bản
  3. Áp dụng kỹ thuật token hóa
  4. Tạo một biểu mẫu từ độc đáo với SpaCy
  5. Trích xuất thông tin với biểu thức chính quy

  • Đố. Tiền xử lý dữ liệu văn bản

Giáo viên

Alexis Perrier

Nhà tư vấn khoa học dữ liệu, tác giả và giảng viên. Theo dõi @alexip trên Twitter để có thêm suy nghĩ về khoa học dữ liệu

Chủ Đề