Bỏ qua dòng mới regex Python

Vì vậy, đối với các chuỗi đơn giản, như hello world,

import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
0 hoạt động hoàn hảo. Nhưng nếu bạn có một chuỗi đại diện cho các dòng trong một tệp chẳng hạn, thì các dòng này sẽ được phân tách bằng dấu tách dòng, chẳng hạn như
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
1 [dòng mới] trên các hệ thống giống Unix và
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
2 [dòng xuống dòng và xuống dòng] trên Windows

Theo mặc định trong hầu hết các công cụ regex,

import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
3 không khớp với các ký tự dòng mới, vì vậy quá trình khớp dừng ở cuối mỗi dòng logic. Nếu bạn muốn
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
3 thực sự khớp với mọi thứ, kể cả dòng mới, bạn cần bật chế độ "chấm-khớp-tất cả" trong công cụ biểu thức chính quy mà bạn chọn [ví dụ: thêm cờ trong Python hoặc
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
5 trong PCRE

💬 Thử thách. Làm cách nào để thiết kế mẫu biểu thức chính quy khớp với các ký tự khoảng trắng, chẳng hạn như khoảng trống

import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
6 và ký tự dạng bảng
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
7, nhưng không phải ký tự xuống dòng
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
8?

Một ví dụ về điều này là thay thế tất cả khoảng trắng [ngoại trừ dòng mới] giữa một tệp được phân cách bằng dấu cách bằng dấu phẩy để lấy CSV

Phương pháp 1. Sử dụng lớp ký tự

Mẫu lớp ký tự

import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
9 khớp với một khoảng trống
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
6 hoặc ký tự dạng bảng
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
7, nhưng không phải là ký tự xuống dòng. Nếu bạn muốn khớp một số khoảng trống tùy ý ngoại trừ các dòng mới, hãy thêm bộ định lượng cộng vào mẫu như vậy.
a,b,c
d,e,f
0

Đây là một ví dụ trong đó bạn thay thế tất cả khoảng trắng phân tách [ngoại trừ dòng mới] bằng dấu phẩy để nhận đầu ra có định dạng CSV

import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]

đầu ra

a,b,c
d,e,f

Tại sao khoảng trống trong mẫu
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
9?

Lý do có một khoảng trống trong mẫu là để khớp với khoảng trống. Lớp ký tự về cơ bản là một mối quan hệ OR, tôi. e. , một mục trong lớp ký tự được khớp. Đối với mẫu đã cho, nó khớp với khoảng trống

import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
6 hoặc ký tự dạng bảng
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
7

🌍 Tìm hiểu thêm. Lớp ký tự [Bộ ký tự] — Hướng dẫn cơ bản về Python

Phương pháp 2. Khớp các ký tự khoảng trắng khác nhau riêng lẻ

Phương pháp trước chỉ khớp với các ký tự tab ngang [U+0009] và dấu cách ngắt [U+0020]. Nếu bạn muốn kiểm soát chi tiết hơn về ký tự khoảng trắng nào khớp và ký tự nào không khớp, bạn có thể sử dụng phương pháp cơ bản sau

Danh sách các ký tự khoảng trắng Unicode sau đây

a,b,c
d,e,f
4 chứa tất cả các biến thể khoảng trắng chính mà bạn có thể muốn kiểm tra chuỗi của mình để biết. Bạn có thể tạo một lớp ký tự bằng cách sử dụng biểu thức chuỗi
a,b,c
d,e,f
5

Đây là một biến thể tìm tất cả các ký tự khoảng trắng phù hợp trong một văn bản nhất định

import re

UNICODE_WHITESPACES = [
    "\u0009", # character tabulation
    "\u000a", # line feed
    "\u000b", # line tabulation
    "\u000c", # form feed
    "\u000d", # carriage return
    "\u0020", # space
    "\u0085", # next line
    "\u00a0", # no-break space
    "\u1680", # ogham space mark
    "\u2000", # en quad
    "\u2001", # em quad
    "\u2002", # en space
    "\u2003", # em space
    "\u2004", # three-per-em space
    "\u2005", # four-per-em space
    "\u2006", # six-per-em space
    "\u2007", # figure space
    "\u2008", # punctuation space
    "\u2009", # thin space
    "\u200A", # hair space
    "\u2028", # line separator
    "\u2029", # paragraph separator
    "\u202f", # narrow no-break space
    "\u205f", # medium mathematical space
    "\u3000", # ideographic space
]

txt = ' \t\n\r'
pattern = '[' + ''.join[UNICODE_WHITESPACES] + ']'
matches = re.findall[pattern, txt]
print[matches]
# [' ', '\t', '\n', '\r']

Tất nhiên, bạn có thể hạn chế điều này chỉ chứa các khoảng trắng không liên quan đến dòng mới

Phương pháp 3. Khớp các khoảng trắng khác nhau riêng lẻ ngoại trừ các dòng mới

Đoạn mã sau sử dụng hằng số

a,b,c
d,e,f
6 nhưng nhận xét các khoảng trắng dòng mới để các ký tự liên quan đến dòng mới như
import re

txt = 'a   \t  b        c\nd  e   f'
csv_txt = re.sub['[ \t]+', ',', txt]
print[csv_txt]
8 và
a,b,c
d,e,f
8 không còn khớp nữa

________số 8

Tất nhiên, bạn có thể nhận xét các ký tự Unicode khoảng trắng riêng lẻ mà bạn không muốn khớp theo yêu cầu của ứng dụng của riêng bạn

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

\r và \n trong regex là gì?

Regex nhận ra các chuỗi thoát phổ biến như \n cho dòng mới, \t cho tab, \r cho xuống dòng , \nnn cho .

Ý nghĩa của \1 trong regex trong Python là gì?

\1 tương đương với re. Tìm kiếm[. ]. group[1] , biểu thức được phân cách bằng dấu ngoặc đơn đầu tiên bên trong biểu thức chính quy . Đó cũng là một sự thật thú vị, một phần lý do khiến các biểu thức chính quy chậm hơn đáng kể trong Python và các ngôn ngữ lập trình khác so với yêu cầu của lý thuyết CS.

Slash's regex là gì?

Dấu gạch chéo ngược kết hợp với ký tự chữ có thể tạo mã thông báo biểu thức chính quy có ý nghĩa đặc biệt. e. g. \d là viết tắt khớp với một chữ số từ 0 đến 9 . Thoát khỏi một siêu ký tự duy nhất bằng dấu gạch chéo ngược hoạt động trong tất cả các hương vị của biểu thức chính quy.

Chủ Đề