Hướng dẫn mastering python regular expressions github - làm chủ biểu thức chính quy python github

Permalink

bậc thầy

Chuyển nhánh/thẻ

Không thể tải các nhánh

Không có gì để hiển thị

{{refname}}

Tên đã được sử dụng

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh GIT chấp nhận cả tên thẻ và tên chi nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi bất ngờ. Bạn có chắc là bạn muốn tạo chi nhánh này?

Đi nộp

  • Đi nộp
  • Sao chép đường dẫn
  • Sao chép permalink

Không thể lấy lại những người đóng góp tại thời điểm này

1,04 MB

Tải xuống

  • Mở với máy tính để bàn
  • Tải xuống
  • Xóa tài liệu

Xin lỗi, có lỗi xảy ra. Tải lại?

Xin lỗi, chúng tôi không thể hiển thị tệp này.

Xin lỗi, tệp này không hợp lệ nên nó không thể được hiển thị.

Một thẻ đã tồn tại với tên chi nhánh được cung cấp. Nhiều lệnh GIT chấp nhận cả tên thẻ và tên chi nhánh, vì vậy việc tạo nhánh này có thể gây ra hành vi bất ngờ. Bạn có chắc là bạn muốn tạo chi nhánh này?

Một nơi mà ngôn ngữ Python thực sự tỏa sáng là trong quá trình thao túng các chuỗi. Phần này sẽ bao gồm một số phương thức và hoạt động định dạng chuỗi tích hợp của Python, trước khi chuyển sang hướng dẫn nhanh về chủ đề cực kỳ hữu ích của các biểu thức thông thường. Các mẫu thao tác chuỗi như vậy thường xuất hiện trong bối cảnh công việc khoa học dữ liệu, và là một trong những lợi ích lớn của Python trong bối cảnh này.

Các chuỗi trong Python có thể được xác định bằng cách sử dụng các trích dẫn đơn hoặc kép (chúng tương đương về mặt chức năng):

In [1]:

x = 'a string'
y = "a string"
x == y

Ngoài ra, có thể xác định các chuỗi đa dòng bằng cú pháp ba điểm:

In [2]:

multiline = """
one
two
three
"""

Với điều này, chúng ta hãy tham quan nhanh một số công cụ thao tác chuỗi của Python.

Thao tác chuỗi đơn giản trong Python¶

Đối với thao tác cơ bản của các chuỗi, các phương thức chuỗi tích hợp của Python có thể cực kỳ thuận tiện. Nếu bạn có một nền tảng làm việc bằng C hoặc một ngôn ngữ cấp thấp khác, bạn có thể sẽ thấy sự đơn giản của các phương pháp của Python cực kỳ mới mẻ. Chúng tôi đã giới thiệu loại chuỗi của Python và một vài trong số các phương pháp này trước đó; Ở đây chúng ta sẽ lặn sâu hơn một chút

Chuỗi định dạng: Điều chỉnh trường hợp Jo

Python làm cho nó khá dễ dàng để điều chỉnh trường hợp của một chuỗi. Ở đây chúng ta sẽ xem xét các phương thức

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
3,
line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
4,
line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
5,
line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
6 và
line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
7, sử dụng chuỗi lộn xộn sau làm ví dụ:

In [3]:

fox = "tHe qUICk bROWn fOx."

Để chuyển đổi toàn bộ chuỗi thành trường hợp trên hoặc trường hợp thấp hơn, bạn có thể sử dụng các phương thức

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
3 hoặc
line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
4 tương ứng:

Một nhu cầu định dạng phổ biến là chỉ viết hoa chữ cái đầu tiên của mỗi từ, hoặc có lẽ là chữ cái đầu tiên của mỗi câu. Điều này có thể được thực hiện với các phương pháp

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
6 và
line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
5:

Các trường hợp có thể được hoán đổi bằng phương pháp

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
7:

Chuỗi định dạng: Thêm và loại bỏ không gian

Một nhu cầu phổ biến khác là loại bỏ các khoảng trống (hoặc các ký tự khác) từ đầu hoặc cuối chuỗi. Phương pháp cơ bản để loại bỏ các ký tự là phương pháp

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
3, loại bỏ khoảng trắng từ đầu và cuối dòng:

In [9]:

line = '         this is the content         '
line.strip()

Để loại bỏ không gian ở bên phải hoặc bên trái, hãy sử dụng

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
4 hoặc
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
5 tương ứng:

Để loại bỏ các ký tự khác ngoài không gian, bạn có thể chuyển ký tự mong muốn cho phương thức

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
3:

In [12]:

num = "000000000000435"
num.strip('0')

Ngược lại với hoạt động này, thêm không gian hoặc các ký tự khác, có thể được thực hiện bằng các phương thức

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
7,
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
8 và
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
9.

Ví dụ: chúng ta có thể sử dụng phương thức

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
7 để tập trung một chuỗi đã cho trong một số lượng không gian nhất định:

In [13]:

line = "this is the content"
line.center(30)

Tương tự,

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
8 và
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found
9 sẽ thông số bên trái hoặc bên phải chuỗi trong khoảng trắng có độ dài nhất định:

Tất cả các phương pháp này cũng chấp nhận bất kỳ ký tự nào sẽ được sử dụng để lấp đầy không gian. Ví dụ:

Bởi vì không điền vào là một nhu cầu phổ biến như vậy, Python cũng cung cấp

line.replace('brown', 'red')
3, đây là phương pháp đặc biệt để đánh một chuỗi có một chuỗi với số không:

Tìm và thay thế Subrings¶

Nếu bạn muốn tìm sự xuất hiện của một ký tự nhất định trong một chuỗi, ________ 84/________ 85, ________ 86/________ 87 và

line.replace('brown', 'red')
8 là các phương pháp tích hợp tốt nhất.

line.replace('brown', 'red')
4 và
line.replace('brown', 'red')
6 rất giống nhau, trong đó họ tìm kiếm sự xuất hiện đầu tiên của ký tự hoặc chuỗi con trong một chuỗi và trả về chỉ mục của chuỗi con:

In [18]:

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')

Sự khác biệt duy nhất giữa

line.replace('brown', 'red')
4 và
line.replace('brown', 'red')
6 là hành vi của chúng khi không tìm thấy chuỗi tìm kiếm;
line.replace('brown', 'red')
4 Trả về
'the quick red fox jumped over a lazy dog'
4, trong khi
line.replace('brown', 'red')
6 tăng
'the quick red fox jumped over a lazy dog'
6:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
 in ()
----> 1 line.index('bear')

ValueError: substring not found

Các

line.replace('brown', 'red')
5 và
line.replace('brown', 'red')
7 có liên quan hoạt động tương tự, ngoại trừ họ tìm kiếm sự xuất hiện đầu tiên từ cuối thay vì đầu chuỗi:

Đối với trường hợp đặc biệt để kiểm tra một chuỗi con ở đầu hoặc cuối của chuỗi, Python cung cấp các phương thức

'the quick red fox jumped over a lazy dog'
9 và
multiline = """
one
two
three
"""
00:

Để tiến thêm một bước và thay thế một chuỗi con nhất định bằng một chuỗi mới, bạn có thể sử dụng phương thức

line.replace('brown', 'red')
8. Ở đây, hãy thay thế
multiline = """
one
two
three
"""
02 bằng
multiline = """
one
two
three
"""
03:

In [25]:

line.replace('brown', 'red')

Out[25]:

'the quick red fox jumped over a lazy dog'

Hàm

line.replace('brown', 'red')
8 trả về một chuỗi mới và sẽ thay thế tất cả các lần xuất hiện của đầu vào:

Out[26]:

multiline = """
one
two
three
"""
0

Chuỗi phân tách và phân vùng

Nếu bạn muốn tìm một chuỗi con và sau đó chia chuỗi dựa trên vị trí của nó, các phương thức

multiline = """
one
two
three
"""
05 và/hoặc
multiline = """
one
two
three
"""
06 là những gì bạn đang tìm kiếm. Cả hai sẽ trả lại một chuỗi các chuỗi con.

Phương thức

multiline = """
one
two
three
"""
05 trả về một tuple với ba phần tử: phần phụ trước phiên bản đầu tiên của điểm phân chia, chính điểm phân chia và phần phụ sau:

Out[27]:

multiline = """
one
two
three
"""
1

Phương thức

multiline = """
one
two
three
"""
08 là tương tự, nhưng tìm kiếm từ bên phải của chuỗi.

Phương pháp

multiline = """
one
two
three
"""
06 có lẽ hữu ích hơn; Nó tìm thấy tất cả các trường hợp của điểm phân chia và trả về các chuỗi con ở giữa. Mặc định là phân chia trên bất kỳ khoảng trắng nào, trả lại danh sách các từ riêng lẻ trong một chuỗi:

Out[28]:

multiline = """
one
two
three
"""
2

Một phương pháp liên quan là

multiline = """
one
two
three
"""
10, phân tách các ký tự mới. Hãy làm điều này với một haiku, được quy cho là nhà thơ thế kỷ 17 Matsuo Bashō:

In [29]:

multiline = """
one
two
three
"""
3

Out[29]:

multiline = """
one
two
three
"""
4

Lưu ý rằng nếu bạn muốn hoàn tác

multiline = """
one
two
three
"""
06, bạn có thể sử dụng phương thức
multiline = """
one
two
three
"""
12, trả về một chuỗi được xây dựng từ điểm chia và có thể lặp lại:

In [30]:

multiline = """
one
two
three
"""
5

Một mẫu phổ biến là sử dụng ký tự đặc biệt

multiline = """
one
two
three
"""
13 (Newline) để kết hợp các dòng đã được phân chia trước đó và khôi phục đầu vào:

In [31]:

multiline = """
one
two
three
"""
6

multiline = """
one
two
three
"""
7

Định dạng chuỗi

Trong các phương pháp trước, chúng tôi đã học được cách trích xuất các giá trị từ các chuỗi và tự thao tác các chuỗi thành các định dạng mong muốn. Một cách sử dụng các phương thức chuỗi là để thao tác các biểu diễn chuỗi của các giá trị của các loại khác. Tất nhiên, các biểu diễn chuỗi luôn có thể được tìm thấy bằng cách sử dụng hàm

multiline = """
one
two
three
"""
14; Ví dụ:

In [33]:

multiline = """
one
two
three
"""
8

Out[33]:

multiline = """
one
two
three
"""
9

Một cách linh hoạt hơn để làm điều này là sử dụng các chuỗi định dạng, là các chuỗi có các điểm đánh dấu đặc biệt (được ghi nhận bởi niềng răng xoăn) trong đó các giá trị được định dạng chuỗi sẽ được chèn. Đây là một ví dụ cơ bản:

In [34]:

fox = "tHe qUICk bROWn fOx."
0

Out[34]:

multiline = """
one
two
three
"""
9

Bên trong điểm đánh dấu

multiline = """
one
two
three
"""
15, bạn cũng có thể bao gồm thông tin về chính xác những gì bạn muốn xuất hiện ở đó. Nếu bạn bao gồm một số, nó sẽ đề cập đến chỉ mục của đối số để chèn:

In [35]:

fox = "tHe qUICk bROWn fOx."
2

Out[35]:

fox = "tHe qUICk bROWn fOx."
3

Nếu bạn bao gồm một chuỗi, nó sẽ đề cập đến khóa của bất kỳ đối số từ khóa nào:

In [36]:

fox = "tHe qUICk bROWn fOx."
4

Out[36]:

fox = "tHe qUICk bROWn fOx."
3

Cuối cùng, đối với các đầu vào số, bạn có thể bao gồm các mã định dạng kiểm soát cách giá trị được chuyển đổi thành một chuỗi. Ví dụ: để in một số dưới dạng điểm nổi với ba chữ số sau điểm thập phân, bạn có thể sử dụng các mục sau:

In [37]:

fox = "tHe qUICk bROWn fOx."
6

Như trước đây, ở đây "

multiline = """
one
two
three
"""
16" đề cập đến chỉ số của giá trị được chèn. Các dấu hiệu "
multiline = """
one
two
three
"""
17" mà mã định dạng sẽ theo sau. "
multiline = """
one
two
three
"""
18" mã hóa độ chính xác mong muốn: ba chữ số vượt quá điểm thập phân, định dạng điểm nổi.

Phong cách đặc tả định dạng này rất linh hoạt và các ví dụ ở đây hầu như không làm trầy xước bề mặt của các tùy chọn định dạng có sẵn. Để biết thêm thông tin về cú pháp của các chuỗi định dạng này, hãy xem phần Đặc tả định dạng của tài liệu trực tuyến của Python.

Phù hợp với mô hình linh hoạt với biểu thức thông thường

Các phương pháp của loại

multiline = """
one
two
three
"""
19 của Python cung cấp cho bạn một bộ công cụ mạnh mẽ để định dạng, chia tách và thao tác dữ liệu chuỗi. Nhưng thậm chí các công cụ mạnh mẽ hơn cũng có sẵn trong mô-đun biểu thức chính quy tích hợp của Python. Biểu thức thường xuyên là một chủ đề lớn; Có toàn bộ cuốn sách được viết về chủ đề này (bao gồm cả Jeffrey E.F.

Mục tiêu của tôi ở đây là cung cấp cho bạn một ý tưởng về các loại vấn đề có thể được giải quyết bằng cách sử dụng các biểu thức thông thường, cũng như một ý tưởng cơ bản về cách sử dụng chúng trong Python. Tôi sẽ đề xuất một số tài liệu tham khảo để tìm hiểu thêm về các nguồn lực tiếp theo về các biểu thức thông thường.

Về cơ bản, các biểu thức chính quy là một phương tiện phù hợp với mô hình linh hoạt trong các chuỗi. Nếu bạn thường xuyên sử dụng dòng lệnh, có lẽ bạn đã quen thuộc với loại phù hợp linh hoạt này với ký tự "

multiline = """
one
two
three
"""
20", hoạt động như một ký tự đại diện. Ví dụ: chúng ta có thể liệt kê tất cả các máy tính xách tay Ipython (nghĩa là các tệp có phần mở rộng .ipynb) với "python" trong tên tệp của chúng bằng cách sử dụng ký tự đại diện "
multiline = """
one
two
three
"""
20" để phù hợp với bất kỳ ký tự nào ở giữa:

fox = "tHe qUICk bROWn fOx."
7

Các biểu thức chính quy khái quát ý tưởng "ký tự đại diện" này thành một loạt các hệ thống phù hợp chuỗi linh hoạt này. Giao diện Python với các biểu thức chính quy được chứa trong mô-đun

multiline = """
one
two
three
"""
22 tích hợp; Ví dụ đơn giản, hãy sử dụng nó để sao chép chức năng của phương thức chuỗi
multiline = """
one
two
three
"""
06:

In [39]:

fox = "tHe qUICk bROWn fOx."
8

Out[39]:

multiline = """
one
two
three
"""
2

Ở đây trước tiên chúng tôi đã biên soạn một biểu thức thông thường, sau đó sử dụng nó để phân chia một chuỗi. Giống như phương thức

multiline = """
one
two
three
"""
06 của Python trả về một danh sách tất cả các chuỗi con giữa khoảng trắng, phương thức biểu thức thông thường
multiline = """
one
two
three
"""
06 trả về một danh sách tất cả các chuỗi con giữa các trận đấu với mẫu đầu vào.

Trong trường hợp này, đầu vào là

multiline = """
one
two
three
"""
26: "
multiline = """
one
two
three
"""
27" là một ký tự đặc biệt phù hợp với bất kỳ khoảng trắng nào (không gian, tab, newline, v.v.) và "
multiline = """
one
two
three
"""
28" là một ký tự chỉ ra một hoặc nhiều thực thể trước nó. Do đó, biểu thức chính quy phù hợp với bất kỳ chuỗi con bao gồm một hoặc nhiều không gian.

Phương pháp

multiline = """
one
two
three
"""
06 ở đây về cơ bản là một thói quen thuận tiện được xây dựng dựa trên hành vi phù hợp với mô hình này; Cơ bản hơn là phương thức
multiline = """
one
two
three
"""
30, sẽ cho bạn biết liệu sự khởi đầu của chuỗi có phù hợp với mẫu:

In [40]:

line = '         this is the content         '
line.strip()
0

line = '         this is the content         '
line.strip()
1

Giống như

multiline = """
one
two
three
"""
06, có những thói quen tiện lợi tương tự để tìm trận đấu đầu tiên (như
multiline = """
one
two
three
"""
32 hoặc
multiline = """
one
two
three
"""
33) hoặc để tìm và thay thế (như
multiline = """
one
two
three
"""
34). Chúng tôi sẽ sử dụng lại dòng từ trước:

In [41]:

line = '         this is the content         '
line.strip()
2

Với điều này, chúng ta có thể thấy rằng phương thức

multiline = """
one
two
three
"""
35 hoạt động rất giống
multiline = """
one
two
three
"""
32 hoặc
multiline = """
one
two
three
"""
33:

In [43]:

line = '         this is the content         '
line.strip()
3

Tương tự, phương thức

multiline = """
one
two
three
"""
38 hoạt động giống như
multiline = """
one
two
three
"""
34:

In [44]:

line = '         this is the content         '
line.strip()
4

Out[44]:

line = '         this is the content         '
line.strip()
5

Out[45]:

line = '         this is the content         '
line.strip()
5

Với một chút suy nghĩ, các hoạt động chuỗi gốc khác cũng có thể được chọn là biểu thức thông thường.

Một ví dụ tinh vi hơn

Nhưng, bạn có thể hỏi, tại sao bạn muốn sử dụng cú pháp phức tạp và dài dòng hơn của các biểu thức thông thường hơn là các phương thức chuỗi đơn giản và trực quan hơn? Ưu điểm là các biểu thức thường xuyên mang lại sự linh hoạt hơn nhiều.

Ở đây chúng tôi sẽ xem xét một ví dụ phức tạp hơn: Nhiệm vụ chung là khớp địa chỉ email. Tôi sẽ bắt đầu bằng cách viết một biểu thức chính quy (hơi không thể giải mã), và sau đó đi qua những gì đang diễn ra. Nó đi từ đây:

In [46]:

line = '         this is the content         '
line.strip()
7

Sử dụng điều này, nếu chúng tôi được cung cấp một dòng từ một tài liệu, chúng tôi có thể nhanh chóng trích xuất những thứ trông giống như địa chỉ email

In [47]:

line = '         this is the content         '
line.strip()
8

Out[47]:

line = '         this is the content         '
line.strip()
9

(Lưu ý rằng các địa chỉ này được tạo thành hoàn toàn; có lẽ có những cách tốt hơn để liên lạc với Guido).

Chúng tôi có thể thực hiện các hoạt động tiếp theo, như thay thế các địa chỉ email này bằng một chuỗi khác, có lẽ để ẩn các địa chỉ trong đầu ra:

In [48]:

num = "000000000000435"
num.strip('0')
0

Out[48]:

num = "000000000000435"
num.strip('0')
1

Cuối cùng, lưu ý rằng nếu bạn thực sự muốn khớp bất kỳ địa chỉ email nào, biểu thức chính quy trước đó quá đơn giản. Ví dụ, nó chỉ cho phép các địa chỉ làm từ các ký tự chữ và số kết thúc ở một trong một số hậu tố miền phổ biến. Vì vậy, ví dụ, khoảng thời gian được sử dụng ở đây có nghĩa là chúng ta chỉ tìm thấy một phần của địa chỉ:

In [49]:

num = "000000000000435"
num.strip('0')
2

Điều này sẽ cho thấy cách các biểu thức thông thường không thể tha thứ nếu bạn không cẩn thận! Nếu bạn tìm kiếm trên mạng, bạn có thể tìm thấy một số gợi ý cho các biểu thức thông thường sẽ phù hợp với tất cả các email hợp lệ, nhưng hãy cẩn thận: chúng liên quan nhiều hơn so với biểu thức đơn giản được sử dụng ở đây!

Khái niệm cơ bản về cú pháp biểu thức chính quy

Cú pháp của các biểu thức chính quy là một chủ đề quá lớn cho phần ngắn này. Tuy nhiên, một chút quen thuộc có thể đi một chặng đường dài: Tôi sẽ đi qua một số cấu trúc cơ bản ở đây, và sau đó liệt kê một số tài nguyên hoàn chỉnh hơn mà bạn có thể tìm hiểu thêm. Hy vọng của tôi là Primer nhanh sau đây sẽ cho phép bạn sử dụng các tài nguyên này một cách hiệu quả.

Chuỗi đơn giản được khớp trực tiếp và

Nếu bạn xây dựng một biểu thức thông thường trên một chuỗi các ký tự hoặc chữ số đơn giản, nó sẽ khớp với chuỗi chính xác đó:

Trong & nbsp; [50]:

num = "000000000000435"
num.strip('0')
3

Một số nhân vật có ý nghĩa đặc biệt

Mặc dù các chữ cái hoặc số đơn giản là các trận đấu trực tiếp, có một số ít các ký tự có ý nghĩa đặc biệt trong các biểu thức chính quy. Họ đang:

num = "000000000000435"
num.strip('0')
4

Chúng tôi sẽ thảo luận về ý nghĩa của một số trong những điều này trong giây lát. Trong khi đó, bạn nên biết rằng nếu bạn muốn khớp trực tiếp với bất kỳ ký tự nào trong số này, bạn có thể thoát khỏi chúng bằng một cú đánh ngược:

In [51]:

num = "000000000000435"
num.strip('0')
5

Lời nói đầu

multiline = """
one
two
three
"""
40 trong
multiline = """
one
two
three
"""
41 chỉ ra một chuỗi thô; Trong các chuỗi Python tiêu chuẩn, dấu gạch chéo ngược được sử dụng để biểu thị các ký tự đặc biệt. Ví dụ: một tab được biểu thị bằng
multiline = """
one
two
three
"""
42:

Sự thay thế như vậy không được thực hiện trong một chuỗi thô:

Vì lý do này, bất cứ khi nào bạn sử dụng dấu gạch chéo ngược trong một biểu thức thông thường, việc sử dụng một chuỗi thô là tốt.

Ký tự đặc biệt có thể khớp với các nhóm ký tự

Giống như ký tự

multiline = """
one
two
three
"""
43 trong các biểu thức chính quy có thể thoát khỏi các ký tự đặc biệt, biến chúng thành các ký tự bình thường, nó cũng có thể được sử dụng để mang lại ý nghĩa đặc biệt của các ký tự bình thường. Các ký tự đặc biệt này phù hợp với các nhóm nhân vật được chỉ định và chúng ta đã thấy chúng trước đây. Trong địa chỉ email Regexp từ trước, chúng tôi đã sử dụng ký tự
multiline = """
one
two
three
"""
44, đây là một điểm đánh dấu đặc biệt phù hợp với bất kỳ ký tự chữ và số nào. Tương tự, trong ví dụ
multiline = """
one
two
three
"""
06 đơn giản, chúng ta cũng đã thấy
multiline = """
one
two
three
"""
46, một điểm đánh dấu đặc biệt cho thấy bất kỳ ký tự nào.

Đặt chúng lại với nhau, chúng ta có thể tạo một biểu thức chính quy sẽ khớp với bất kỳ hai chữ cái/chữ số nào có khoảng trắng giữa chúng:

In [54]:

num = "000000000000435"
num.strip('0')
6

Out[54]:

num = "000000000000435"
num.strip('0')
7

Ví dụ này bắt đầu gợi ý về sức mạnh và tính linh hoạt của các biểu thức thông thường.

Bảng sau đây liệt kê một vài trong số các ký tự thường hữu ích:

Tính cáchSự mô tảTính cáchSự mô tả
multiline = """
one
two
three
"""
47
Khớp với bất kỳ chữ số nào
multiline = """
one
two
three
"""
48
Khớp với bất kỳ chữ số nào
multiline = """
one
two
three
"""
46
Kết hợp bất kỳ khoảng trắng
multiline = """
one
two
three
"""
50
Khớp với bất kỳ không gian trắng
multiline = """
one
two
three
"""
44
Khớp với bất kỳ char chữ và số nào
multiline = """
one
two
three
"""
52
Phù hợp với bất kỳ char không phải là doumanumeric

Đây không phải là một danh sách hoặc mô tả toàn diện; Để biết thêm chi tiết, hãy xem tài liệu cú pháp biểu thức chính quy của Python.

Dấu ngoặc vuông phù hợp với các nhóm ký tự tùy chỉnh

Nếu các nhóm ký tự tích hợp không đủ cụ thể cho bạn, bạn có thể sử dụng dấu ngoặc vuông để chỉ định bất kỳ bộ ký tự nào bạn quan tâm. Ví dụ, sau đây sẽ khớp với bất kỳ nguyên âm chữ thường nào:

In [55]:

num = "000000000000435"
num.strip('0')
8

Out[55]:

num = "000000000000435"
num.strip('0')
9

Tương tự, bạn có thể sử dụng dấu gạch ngang để chỉ định một phạm vi: ví dụ,

multiline = """
one
two
three
"""
53 sẽ khớp với bất kỳ chữ cái nào trong trường hợp chữ thường và
multiline = """
one
two
three
"""
54 sẽ khớp với bất kỳ
multiline = """
one
two
three
"""
55,
multiline = """
one
two
three
"""
56 hoặc
multiline = """
one
two
three
"""
57. Chẳng hạn, bạn có thể cần trích xuất từ ​​một mã số cụ thể của tài liệu bao gồm một chữ cái viết hoa theo sau là một chữ số. Bạn có thể làm điều này như sau:

In [56]:

line = "this is the content"
line.center(30)
0

Wildcards phù hợp với các ký tự lặp đi lặp lại

Nếu bạn muốn khớp một chuỗi với, giả sử, ba ký tự chữ và số liên tiếp, có thể viết, ví dụ,

multiline = """
one
two
three
"""
58. Bởi vì đây là một nhu cầu phổ biến như vậy, có một cú pháp cụ thể để phù hợp với sự lặp lại - niềng răng xoăn với một số:

In [57]:

line = "this is the content"
line.center(30)
1

Ra [57]:

line = "this is the content"
line.center(30)
2

Ngoài ra còn có các điểm đánh dấu có sẵn để phù hợp với bất kỳ số lần lặp lại nào - ví dụ: ký tự

multiline = """
one
two
three
"""
59 sẽ khớp với một hoặc nhiều lần lặp lại của những gì trước đó:

In [58]:

line = "this is the content"
line.center(30)
3

Out[58]:

line = "this is the content"
line.center(30)
4

Sau đây là bảng của các dấu hiệu lặp lại có sẵn để sử dụng trong các biểu thức thông thường:

Tính cáchSự mô tảThí dụ
multiline = """
one
two
three
"""
60
Khớp với số 0 hoặc một lần lặp lại trước
multiline = """
one
two
three
"""
61 khớp với
multiline = """
one
two
three
"""
62 hoặc
multiline = """
one
two
three
"""
63
multiline = """
one
two
three
"""
20
Khớp với số không hoặc nhiều sự lặp lại của trước
multiline = """
one
two
three
"""
65 khớp với
multiline = """
one
two
three
"""
62,
multiline = """
one
two
three
"""
63,
multiline = """
one
two
three
"""
68, ________ 169 ...
multiline = """
one
two
three
"""
28
Khớp với một hoặc nhiều lần lặp lại trước
multiline = """
one
two
three
"""
71 khớp với
multiline = """
one
two
three
"""
63,
multiline = """
one
two
three
"""
68, ________ 169 ... nhưng không phải
multiline = """
one
two
three
"""
62
multiline = """
one
two
three
"""
76
Trận đấu
multiline = """
one
two
three
"""
77 Lặp lại của Preeeding
multiline = """
one
two
three
"""
78 khớp với
multiline = """
one
two
three
"""
68
multiline = """
one
two
three
"""
80
Khớp giữa
multiline = """
one
two
three
"""
81 và
multiline = """
one
two
three
"""
77 lặp lại trước
multiline = """
one
two
three
"""
83 khớp
multiline = """
one
two
three
"""
68 hoặc
multiline = """
one
two
three
"""
69

Với những điều cơ bản này, chúng ta hãy quay lại trình bày địa chỉ email của chúng tôi:

In [59]:

line = "this is the content"
line.center(30)
5

Bây giờ chúng ta có thể hiểu điều này có nghĩa là gì: Chúng ta muốn một hoặc nhiều ký tự chữ và số (

multiline = """
one
two
three
"""
86) theo sau là dấu hiệu tại AT (
multiline = """
one
two
three
"""
87), tiếp theo là một hoặc nhiều ký tự chữ và số (
multiline = """
one
two
three
"""
86), tiếp theo là một khoảng thời gian (
multiline = """
one
two
three
"""
89 - lưu ý sự cần thiết Backslash Escape), theo sau là chính xác ba chữ cái chữ thường.

Nếu bây giờ chúng ta muốn sửa đổi điều này để địa chỉ email Obama khớp, chúng ta có thể làm như vậy bằng cách sử dụng ký hiệu khung vuông:

In [60]:

line = "this is the content"
line.center(30)
6

Out[60]:

line = "this is the content"
line.center(30)
7

Chúng tôi đã thay đổi

multiline = """
one
two
three
"""
86 thành
multiline = """
one
two
three
"""
91, vì vậy chúng tôi sẽ phù hợp với bất kỳ ký tự chữ và số hoặc một khoảng thời gian. Với biểu thức linh hoạt hơn này, chúng ta có thể phù hợp với một loạt các địa chỉ email (mặc dù vẫn không phải tất cả - bạn có thể xác định được những thiếu sót khác của biểu thức này không?).

Đối với các biểu thức thông thường hợp chất như trình kết hợp email của chúng tôi, chúng tôi thường muốn trích xuất các thành phần của chúng hơn là toàn bộ trận đấu. Điều này có thể được thực hiện bằng cách sử dụng dấu ngoặc đơn để nhóm kết quả:

In [61]:

line = "this is the content"
line.center(30)
8

In [62]:

line = "this is the content"
line.center(30)
9

Out[62]:

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
0

Như chúng ta thấy, nhóm này thực sự trích xuất một danh sách các thành phần phụ của địa chỉ email.

Chúng ta có thể đi xa hơn một chút và đặt tên cho các thành phần được trích xuất bằng cú pháp

multiline = """
one
two
three
"""
92, trong trường hợp đó các nhóm có thể được trích xuất dưới dạng từ điển Python:

In [63]:

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
1

Out[63]:

line = 'the quick brown fox jumped over a lazy dog'
line.find('fox')
2

Kết hợp những ý tưởng này (cũng như một số cú pháp RegEXP mạnh mẽ mà chúng tôi chưa đề cập ở đây) cho phép bạn linh hoạt và nhanh chóng trích xuất thông tin từ các chuỗi trong Python.

Các nguồn lực khác về biểu thức thường

Các cuộc thảo luận trên chỉ là một cách đối xử nhanh chóng (và khác xa) của chủ đề lớn này. Nếu bạn muốn tìm hiểu thêm, tôi khuyên bạn nên sử dụng các tài nguyên sau:

  • Tài liệu gói
    multiline = """
    one
    two
    three
    """
    
    22 của Python: Tôi thấy rằng tôi nhanh chóng quên cách sử dụng các biểu thức thông thường mỗi khi tôi sử dụng chúng. Bây giờ tôi có những điều cơ bản, tôi đã tìm thấy trang này là một nguồn tài nguyên cực kỳ có giá trị để nhớ lại những gì mỗi nhân vật hoặc trình tự cụ thể có nghĩa là trong một biểu thức thông thường.
  • Biểu thức chính thức chính thức của Python Howto: Một cách tiếp cận tường thuật hơn đối với các biểu thức thường xuyên trong Python.
  • Làm chủ các biểu thức chính quy (Oreilly, 2006) là một cuốn sách hơn 500 trang về chủ đề này. Nếu bạn muốn một cách xử lý thực sự đầy đủ của chủ đề này, đây là tài nguyên cho bạn.

Đối với một số ví dụ về thao tác chuỗi và các biểu thức chính quy trong hành động ở quy mô lớn hơn, hãy xem Pandas: Dữ liệu định hướng cột được dán nhãn, trong đó chúng tôi xem xét việc áp dụng các loại biểu thức này trên các bảng dữ liệu chuỗi trong gói Pandas.