Nhập lại trong Python là gì?

Trong hướng dẫn này, bạn sẽ khám phá các biểu thức chính quy, còn được gọi là biểu thức chính quy, trong Python. A regex is a special sequence of characters that defines a pattern for complex string-matching functionality

Earlier in this series, in the tutorial Strings and Character Data in Python, you learned how to define and manipulate string objects. Since then, you’ve seen some ways to determine whether two strings match each other

  • You can test whether two strings are equal using the operator

  • You can test whether one string is a substring of another with the operator or the

    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    30 and
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    31

String matching like this is a common task in programming, and you can get a lot done with string operators and built-in methods. At times, though, you may need more sophisticated pattern-matching capabilities

In this tutorial, you’ll learn

  • How to access the
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    32 module, which implements regex matching in Python
  • How to use
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    33 to match a pattern against a string
  • How to create complex matching pattern with regex metacharacters

Fasten your seat belt. Regex syntax takes a little getting used to. Nhưng một khi bạn cảm thấy thoải mái với nó, bạn sẽ thấy các biểu thức chính quy gần như không thể thiếu trong lập trình Python của mình

Free Download. Get a sample chapter from Python Tricks. The Book that shows you Python’s best practices with simple examples you can apply instantly to write more beautiful + Pythonic code

Regexes in Python and Their Uses

Imagine you have a string object

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34. Bây giờ, giả sử bạn cần viết mã Python để tìm hiểu xem liệu
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34 có chứa chuỗi con
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36 hay không. There are at least a couple ways to do this. You could use the
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
29 operator

>>>

>>> s = 'foo123bar'
>>> '123' in s
True

Nếu bạn không chỉ muốn biết liệu

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36 có tồn tại trong
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34 hay không mà còn biết nó tồn tại ở đâu, thì bạn có thể sử dụng
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
30 hoặc
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
31. Mỗi trong số này trả về vị trí ký tự trong phạm vi
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34 nơi chuỗi con cư trú

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3

Trong các ví dụ này, việc đối sánh được thực hiện bằng cách so sánh đơn giản từng ký tự. Điều đó sẽ hoàn thành công việc trong nhiều trường hợp. Nhưng đôi khi, vấn đề phức tạp hơn thế

Ví dụ: thay vì tìm kiếm một chuỗi con cố định như

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36, giả sử bạn muốn xác định xem một chuỗi có chứa ba ký tự chữ số thập phân liên tiếp bất kỳ hay không, chẳng hạn như trong các chuỗi
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
44,
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
45,
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
46 và
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
47

So sánh nhân vật nghiêm ngặt sẽ không cắt nó ở đây. Đây là nơi mà các biểu thức chính quy trong Python đến để giải cứu

Loại bỏ các quảng cáo

Lịch sử [rất ngắn gọn] của biểu thức chính quy

Năm 1951, nhà toán học Stephen Cole Kleene đã mô tả khái niệm ngôn ngữ chính quy, một ngôn ngữ có thể nhận ra bởi một máy tự động hữu hạn và có thể diễn đạt chính thức bằng cách sử dụng các biểu thức chính quy. Vào giữa những năm 1960, nhà tiên phong về khoa học máy tính Ken Thompson, một trong những nhà thiết kế ban đầu của Unix, đã triển khai khớp mẫu trong trình soạn thảo văn bản QED bằng cách sử dụng ký hiệu của Kleene.

Kể từ đó, biểu thức chính quy đã xuất hiện trong nhiều ngôn ngữ lập trình, trình soạn thảo và các công cụ khác như một phương tiện để xác định xem một chuỗi có khớp với một mẫu đã chỉ định hay không. Python, Java và Perl đều hỗ trợ chức năng regex, cũng như hầu hết các công cụ Unix và nhiều trình soạn thảo văn bản

Mô-đun
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32

Chức năng Regex trong Python nằm trong một mô-đun có tên

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32. Mô-đun
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 chứa nhiều hàm và phương thức hữu ích, hầu hết trong số đó bạn sẽ tìm hiểu trong phần hướng dẫn tiếp theo của loạt bài này

Hiện tại, bạn sẽ tập trung chủ yếu vào một chức năng,

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
52

Quét một chuỗi để tìm đối sánh regex

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
52 quét
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
54 đang tìm kiếm vị trí đầu tiên mà mẫu
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 khớp. Nếu tìm thấy một kết quả trùng khớp, thì
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 trả về một đối tượng khớp. Nếu không, nó sẽ trả về
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
57

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 lấy một đối số thứ ba tùy chọn
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
59 mà bạn sẽ tìm hiểu ở phần cuối của hướng dẫn này

Cách nhập khẩu
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33

Bởi vì

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
61 nằm trong mô-đun
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32, bạn cần nhập nó trước khi có thể sử dụng nó. Một cách để làm điều này là nhập toàn bộ mô-đun và sau đó sử dụng tên mô-đun làm tiền tố khi gọi hàm

import re
re.search[...]

Alternatively, you can import the function from the module by name and then refer to it without the module name prefix

from re import search
search[...]

You’ll always need to import

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 by one means or another before you’ll be able to use it

The examples in the remainder of this tutorial will assume the first approach shown—importing the

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 module and then referring to the function with the module name prefix.
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33. For the sake of brevity, the
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
66 statement will usually be omitted, but remember that it’s always necessary

For more information on importing from modules and packages, check out Python Modules and Packages—An Introduction

First Pattern-Matching Example

Now that you know how to gain access to

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33, you can give it a try

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7

Here, the search pattern

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 is
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
69 and
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
54 is
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34. The returned match object appears on line 7. Match objects contain a wealth of useful information that you’ll explore soon

For the moment, the important point is that

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 did in fact return a match object rather than
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
57. That tells you that it found a match. In other words, the specified
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 pattern
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
69 is present in
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34

A match object is , so you can use it in a Boolean context like a conditional statement

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.

The interpreter displays the match object as

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
77. This contains some useful information

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
78 indicates the portion of
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
54 in which the match was found. This means the same thing as it would in

>>>

>>> s[3:6]
'123'

In this example, the match starts at character position

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
80 and extends up to but not including position
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
81

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
82 indicates which characters from
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
54 matched

This is a good start. But in this case, the

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 pattern is just the plain string
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36. The pattern matching here is still just character-by-character comparison, pretty much the same as the
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
29 operator and
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
30 examples shown earlier. The match object helpfully tells you that the matching characters were
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36, but that’s not much of a revelation since those were exactly the characters you searched for

You’re just getting warmed up

Loại bỏ các quảng cáo

Python Regex Metacharacters

The real power of regex matching in Python emerges when

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 contains special characters called metacharacters. These have a unique meaning to the regex matching engine and vastly enhance the capability of the search

Consider again the problem of how to determine whether a string contains any three consecutive decimal digit characters

In a regex, a set of characters specified in square brackets [

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
90] makes up a character class. This metacharacter sequence matches any single character that is in the class, as demonstrated in the following example

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
91 matches any single decimal digit character—any character between
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
92 and
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
93, inclusive. The full expression
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
94 matches any sequence of three decimal digit characters. In this case,
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34 matches because it contains three consecutive decimal digit characters,
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36

These strings also match

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

On the other hand, a string that doesn’t contain three consecutive digits won’t match

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None

With regexes in Python, you can identify patterns in a string that you wouldn’t be able to find with the

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
29 operator or with string methods

Take a look at another regex metacharacter. The dot [

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98] metacharacter matches any character except a newline, so it functions like a wildcard

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
0

In the first example, the regex

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
99 matches
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36 because the
import re
re.search[...]
01 and
import re
re.search[...]
02 match literally, and the
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98 matches the
import re
re.search[...]
04. Here, you’re essentially asking, “Does
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34 contain a
import re
re.search[...]
01, then any character [except a newline], then a
import re
re.search[...]
02?” The answer is yes for
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
44 but no for
import re
re.search[...]
09

These examples provide a quick illustration of the power of regex metacharacters. Character class and dot are but two of the metacharacters supported by the

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 module. There are many more. Next, you’ll explore them fully

Metacharacters Supported by the
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 Module

The following table briefly summarizes all the metacharacters supported by the

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 module. Some characters serve more than one purpose

Character[s]Meaning

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98Matches any single character except newline
import re
re.search[...]
14∙ Anchors a match at the start of a string
∙ Complements a character class
import re
re.search[...]
15Anchors a match at the end of a string
import re
re.search[...]
16Matches zero or more repetitions
import re
re.search[...]
17Matches one or more repetitions
import re
re.search[...]
18∙ Matches zero or one repetition
∙ Specifies the non-greedy versions of
import re
re.search[...]
16,
import re
re.search[...]
17, and
import re
re.search[...]
18
∙ Giới thiệu xác nhận nhìn trước hoặc nhìn sau
∙ Creates a named group
import re
re.search[...]
22Matches an explicitly specified number of repetitions
import re
re.search[...]
23∙ Escapes a metacharacter of its special meaning
∙ Introduces a special character class
∙ Introduces a grouping backreference
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
90Specifies a character class
import re
re.search[...]
25Designates alternation
import re
re.search[...]
26Creates a group
import re
re.search[...]
27
import re
re.search[...]
28
import re
re.search[...]
29
import re
re.search[...]
30Designate a specialized group
import re
re.search[...]
31Creates a named group

Điều này có vẻ giống như một lượng thông tin quá lớn, nhưng Các phần sau đây sẽ xem xét chi tiết từng thông tin này

The regex parser regards any character not listed above as an ordinary character that matches only itself. Ví dụ, trong hình trên, bạn đã thấy điều này

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
1

In this case,

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
69 is technically a regex, but it’s not a very interesting one because it doesn’t contain any metacharacters. It just matches the string
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
36

Things get much more exciting when you throw metacharacters into the mix. Các phần sau đây giải thích chi tiết cách bạn có thể sử dụng từng siêu ký tự hoặc trình tự siêu ký tự để nâng cao chức năng khớp mẫu

Loại bỏ các quảng cáo

Siêu ký tự phù hợp với một ký tự duy nhất

Chuỗi siêu ký tự trong phần này cố khớp với một ký tự đơn từ chuỗi tìm kiếm. Khi trình phân tích cú pháp regex gặp một trong các chuỗi siêu ký tự này, một kết quả khớp sẽ xảy ra nếu ký tự ở vị trí phân tích cú pháp hiện tại khớp với mô tả mà chuỗi mô tả

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
90

Chỉ định một bộ ký tự cụ thể để khớp

Các ký tự nằm trong dấu ngoặc vuông [_______0_______90] đại diện cho một lớp ký tự—một tập hợp liệt kê các ký tự để so khớp từ. Chuỗi siêu ký tự của lớp ký tự sẽ khớp với bất kỳ ký tự đơn nào có trong lớp

Bạn có thể liệt kê các ký tự riêng lẻ như thế này

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
2

Trình tự siêu ký tự

import re
re.search[...]
36 khớp với bất kỳ ký tự đơn lẻ nào
import re
re.search[...]
37,
import re
re.search[...]
38,
import re
re.search[...]
39 hoặc
import re
re.search[...]
40. Trong ví dụ này, regex
import re
re.search[...]
41 khớp với cả
import re
re.search[...]
42 và
import re
re.search[...]
43 [và cũng sẽ khớp với
import re
re.search[...]
44 và
import re
re.search[...]
45]

Một lớp ký tự cũng có thể chứa một dải ký tự được phân tách bằng dấu gạch nối [

import re
re.search[...]
46], trong trường hợp đó, nó khớp với bất kỳ ký tự đơn nào trong dải đó. Ví dụ:
import re
re.search[...]
47 khớp với bất kỳ ký tự chữ cái viết thường nào trong khoảng từ
import re
re.search[...]
37 đến
import re
re.search[...]
40, bao gồm

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
3

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
91 khớp với bất kỳ ký tự chữ số nào

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
4

Trong trường hợp này,

import re
re.search[...]
51 khớp với một chuỗi gồm hai chữ số. Phần đầu tiên của chuỗi
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
44 phù hợp là
import re
re.search[...]
53

import re
re.search[...]
54 khớp với bất kỳ ký tự chữ số thập lục phân nào

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
5

Ở đây,

import re
re.search[...]
54 khớp với ký tự chữ số thập lục phân đầu tiên trong chuỗi tìm kiếm,
import re
re.search[...]
37

Ghi chú. Trong các ví dụ trên, giá trị trả về luôn là giá trị khớp ngoài cùng bên trái có thể.

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 quét chuỗi tìm kiếm từ trái sang phải và ngay khi nó tìm thấy kết quả khớp cho
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55, nó sẽ dừng quét và trả về kết quả khớp

Bạn có thể bổ sung cho một lớp ký tự bằng cách chỉ định

import re
re.search[...]
14 làm ký tự đầu tiên, trong trường hợp đó, ký tự này khớp với bất kỳ ký tự nào không có trong tập hợp. Trong ví dụ sau,
import re
re.search[...]
60 khớp với bất kỳ ký tự nào không phải là chữ số

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
6

Ở đây, đối tượng khớp chỉ ra rằng ký tự đầu tiên trong chuỗi không phải là chữ số là

import re
re.search[...]
61

Nếu ký tự

import re
re.search[...]
14 xuất hiện trong một lớp ký tự nhưng không phải là ký tự đầu tiên, thì ký tự đó không có ý nghĩa đặc biệt và khớp với ký tự
import re
re.search[...]
63 theo nghĩa đen

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
7

Như bạn đã thấy, bạn có thể chỉ định một dãy ký tự trong một lớp ký tự bằng cách tách các ký tự bằng dấu gạch nối. Điều gì sẽ xảy ra nếu bạn muốn lớp ký tự bao gồm một ký tự gạch nối theo nghĩa đen?

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
8

Nếu bạn muốn bao gồm một ký tự

import re
re.search[...]
65 trong một lớp ký tự, thì bạn có thể đặt nó làm ký tự đầu tiên hoặc thoát ký tự đó bằng dấu gạch chéo ngược

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
9

Các siêu ký tự regex khác mất đi ý nghĩa đặc biệt của chúng bên trong một lớp ký tự

>>>

import re
re.search[...]
0

Như bạn đã thấy trong bảng trên,

import re
re.search[...]
16 và
import re
re.search[...]
17 có ý nghĩa đặc biệt trong biểu thức chính quy trong Python. Chúng chỉ định sự lặp lại mà bạn sẽ sớm tìm hiểu thêm. Nhưng trong ví dụ này, chúng ở trong một lớp ký tự, vì vậy chúng khớp với nhau theo nghĩa đen

dấu chấm [______0_______98]

Chỉ định một ký tự đại diện

Siêu ký tự

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98 khớp với bất kỳ ký tự đơn nào ngoại trừ một dòng mới

>>>

import re
re.search[...]
1

Là một biểu thức chính quy, về cơ bản,

import re
re.search[...]
70 có nghĩa là các ký tự
import re
re.search[...]
71, sau đó là bất kỳ ký tự nào ngoại trừ dòng mới, sau đó là các ký tự
import re
re.search[...]
42. Chuỗi đầu tiên được hiển thị ở trên,
import re
re.search[...]
73, khớp với hóa đơn vì ký tự phụ
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98 khớp với
import re
re.search[...]
75

Chuỗi thứ hai và thứ ba không khớp. Trong trường hợp cuối cùng, mặc dù có một ký tự giữa

import re
re.search[...]
71 và
import re
re.search[...]
42, nhưng đó là một dòng mới và theo mặc định, siêu ký tự
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98 không khớp với một dòng mới. Tuy nhiên, có một cách để buộc
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98 khớp với một dòng mới mà bạn sẽ tìm hiểu ở phần cuối của hướng dẫn này

import re
re.search[...]
80
import re
re.search[...]
81

Khớp dựa trên việc một ký tự có phải là ký tự từ hay không

import re
re.search[...]
80 khớp với bất kỳ ký tự chữ và số nào. Các ký tự của từ là chữ hoa và chữ thường, chữ số và ký tự gạch dưới [
import re
re.search[...]
83], do đó, về cơ bản,
import re
re.search[...]
80 là viết tắt của
import re
re.search[...]
85

>>>

import re
re.search[...]
2

Trong trường hợp này, ký tự từ đầu tiên trong chuỗi

import re
re.search[...]
86 là
import re
re.search[...]
37

import re
re.search[...]
81 thì ngược lại. Nó khớp với bất kỳ ký tự không phải từ nào và tương đương với
import re
re.search[...]
89

>>>

import re
re.search[...]
3

Ở đây, ký tự không phải từ đầu tiên trong

import re
re.search[...]
90 là
import re
re.search[...]
91

import re
re.search[...]
92
import re
re.search[...]
93

Khớp dựa trên việc một ký tự có phải là chữ số thập phân hay không

import re
re.search[...]
92 khớp với bất kỳ ký tự chữ số thập phân nào.
import re
re.search[...]
93 thì ngược lại. Nó khớp với bất kỳ ký tự nào không phải là chữ số thập phân

>>>

import re
re.search[...]
4

import re
re.search[...]
92 về cơ bản tương đương với
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
91 và
import re
re.search[...]
93 tương đương với
import re
re.search[...]
60

from re import search
search[...]
00
from re import search
search[...]
01

Khớp dựa trên việc một ký tự có đại diện cho khoảng trắng hay không

from re import search
search[...]
00 khớp với bất kỳ ký tự khoảng trắng nào

>>>

import re
re.search[...]
5

Lưu ý rằng, không giống như ký tự đại diện dấu chấm,

from re import search
search[...]
00 không khớp với ký tự xuống dòng

from re import search
search[...]
01 đối lập với
from re import search
search[...]
00. Nó khớp với bất kỳ ký tự nào không phải là khoảng trắng

>>>

import re
re.search[...]
6

Một lần nữa,

from re import search
search[...]
00 và
from re import search
search[...]
01 coi một dòng mới là khoảng trắng. Trong ví dụ trên, ký tự không phải khoảng trắng đầu tiên là
import re
re.search[...]
61

Chuỗi lớp ký tự

import re
re.search[...]
80,
import re
re.search[...]
81,
import re
re.search[...]
92,
import re
re.search[...]
93,
from re import search
search[...]
00 và
from re import search
search[...]
01 cũng có thể xuất hiện bên trong lớp ký tự ngoặc vuông

>>>

import re
re.search[...]
7

Trong trường hợp này,

from re import search
search[...]
15 khớp với bất kỳ ký tự chữ số, từ hoặc khoảng trắng nào. Và vì
import re
re.search[...]
80 bao gồm
import re
re.search[...]
92, nên cùng một lớp ký tự cũng có thể được biểu thị ngắn hơn một chút là
from re import search
search[...]
18

Loại bỏ các quảng cáo

Thoát khỏi siêu ký tự

Đôi khi, bạn sẽ muốn đưa một siêu ký tự vào biểu thức chính quy của mình, ngoại trừ việc bạn không muốn nó mang ý nghĩa đặc biệt của nó. Thay vào đó, bạn sẽ muốn nó thể hiện chính nó dưới dạng ký tự chữ

dấu gạch chéo ngược [

import re
re.search[...]
23]

Loại bỏ ý nghĩa đặc biệt của một siêu ký tự

Như bạn vừa thấy, ký tự gạch chéo ngược có thể giới thiệu các lớp ký tự đặc biệt như từ, chữ số và khoảng trắng. Ngoài ra còn có các chuỗi siêu ký tự đặc biệt được gọi là ký tự neo bắt đầu bằng dấu gạch chéo ngược mà bạn sẽ tìm hiểu bên dưới

Khi nó không phục vụ một trong hai mục đích này, dấu gạch chéo ngược sẽ thoát khỏi các siêu ký tự. Một siêu ký tự đứng trước dấu gạch chéo ngược sẽ mất ý nghĩa đặc biệt của nó và thay vào đó khớp với ký tự chữ. Xem xét các ví dụ sau

>>>

import re
re.search[...]
8

Trong

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 trên dòng 1, dấu chấm [
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98] hoạt động như một ký tự đại diện metacharacter, khớp với ký tự đầu tiên trong chuỗi [
import re
re.search[...]
61]. Ký tự
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98 trong
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 trên dòng 4 được thoát bằng dấu gạch chéo ngược, vì vậy nó không phải là ký tự đại diện. Nó được hiểu theo nghĩa đen và khớp với
from re import search
search[...]
25 tại chỉ mục
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
80 của chuỗi tìm kiếm

Sử dụng dấu gạch chéo ngược để thoát có thể trở nên lộn xộn. Giả sử bạn có một chuỗi chứa một dấu gạch chéo ngược

>>>

import re
re.search[...]
9

Bây giờ, giả sử bạn muốn tạo một

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 khớp với dấu gạch chéo ngược giữa
import re
re.search[...]
71 và
import re
re.search[...]
42. Bản thân dấu gạch chéo ngược là một ký tự đặc biệt trong biểu thức chính quy, vì vậy để chỉ định dấu gạch chéo ngược theo nghĩa đen, bạn cần thoát dấu gạch chéo ngược đó bằng một dấu gạch chéo ngược khác. Nếu đó là trường hợp đó, thì những điều sau đây sẽ hoạt động

>>>

from re import search
search[...]
0

Không hẳn. Đây là những gì bạn nhận được nếu bạn thử nó

>>>

from re import search
search[...]
1

Ối. Chuyện gì đã xảy ra thế?

Vấn đề ở đây là việc thoát dấu gạch chéo ngược xảy ra hai lần, lần đầu tiên bởi trình thông dịch Python trên chuỗi ký tự và sau đó một lần nữa bởi trình phân tích cú pháp biểu thức chính quy trên biểu thức chính quy mà nó nhận được

Đây là chuỗi sự kiện

  1. Trình thông dịch Python là trình thông dịch đầu tiên xử lý chuỗi ký tự
    from re import search
    search[...]
    
    30. Nó diễn giải điều đó dưới dạng dấu gạch chéo ngược đã thoát và chỉ chuyển một dấu gạch chéo ngược duy nhất tới
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    33
  2. Trình phân tích cú pháp biểu thức chính quy chỉ nhận được một dấu gạch chéo ngược duy nhất, đây không phải là biểu thức chính quy có ý nghĩa, do đó xảy ra lỗi lộn xộn

Có hai cách xung quanh điều này. Đầu tiên, bạn có thể thoát cả hai dấu gạch chéo ngược trong chuỗi ký tự gốc

>>>

from re import search
search[...]
2

Làm như vậy gây ra những điều sau đây xảy ra

  1. Thông dịch viên xem
    from re import search
    search[...]
    
    32 như một cặp dấu gạch chéo ngược đã thoát. Nó giảm mỗi cặp thành một dấu gạch chéo ngược và chuyển
    from re import search
    search[...]
    
    30 tới trình phân tích cú pháp biểu thức chính quy
  2. Sau đó, trình phân tích cú pháp regex sẽ thấy
    from re import search
    search[...]
    
    34 là một dấu gạch chéo ngược đã thoát. Là một
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    55, khớp với một ký tự gạch chéo ngược. Bạn có thể thấy từ đối tượng khớp rằng nó khớp với dấu gạch chéo ngược ở chỉ mục
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    80 trong
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    34 như dự kiến. Nó cồng kềnh, nhưng nó hoạt động

Cách thứ hai, và có lẽ sạch hơn, để xử lý việc này là chỉ định

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 bằng cách sử dụng một chuỗi thô

>>>

from re import search
search[...]
3

Điều này ngăn chặn việc thoát ở cấp độ thông dịch viên. Chuỗi

from re import search
search[...]
30 được chuyển không thay đổi tới trình phân tích cú pháp regex, trình phân tích cú pháp này lại thấy một dấu gạch chéo ngược được thoát như mong muốn

Bạn nên sử dụng một chuỗi thô để chỉ định biểu thức chính quy trong Python bất cứ khi nào nó chứa dấu gạch chéo ngược

Loại bỏ các quảng cáo

mỏ neo

Các neo là các đối sánh có độ rộng bằng không. Chúng không khớp với bất kỳ ký tự thực tế nào trong chuỗi tìm kiếm và chúng không sử dụng bất kỳ chuỗi tìm kiếm nào trong quá trình phân tích cú pháp. Thay vào đó, một neo chỉ ra một vị trí cụ thể trong chuỗi tìm kiếm nơi phải xảy ra kết quả khớp

import re
re.search[...]
14
from re import search
search[...]
41

Neo một trận đấu vào đầu của

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
54

Khi trình phân tích cú pháp regex gặp

import re
re.search[...]
14 hoặc
from re import search
search[...]
41, vị trí hiện tại của trình phân tích cú pháp phải ở đầu chuỗi tìm kiếm để nó tìm thấy kết quả khớp

Nói cách khác, regex

from re import search
search[...]
45 quy định rằng
import re
re.search[...]
71 phải có mặt không chỉ ở bất kỳ vị trí cũ nào trong chuỗi tìm kiếm, mà phải ở đầu

>>>

from re import search
search[...]
4

from re import search
search[...]
41 hoạt động tương tự

>>>

from re import search
search[...]
5

import re
re.search[...]
14 và
from re import search
search[...]
41 hoạt động hơi khác nhau ở chế độ
from re import search
search[...]
50. Bạn sẽ tìm hiểu thêm về chế độ
from re import search
search[...]
50 bên dưới trong phần về

import re
re.search[...]
15
from re import search
search[...]
53

Neo một que diêm đến hết

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
54

Khi trình phân tích cú pháp regex gặp phải

import re
re.search[...]
15 hoặc
from re import search
search[...]
53, vị trí hiện tại của trình phân tích cú pháp phải ở cuối chuỗi tìm kiếm để nó tìm thấy kết quả khớp. Bất cứ điều gì đứng trước
import re
re.search[...]
15 hoặc
from re import search
search[...]
53 phải tạo thành phần cuối của chuỗi tìm kiếm

>>>

from re import search
search[...]
6

Trong trường hợp đặc biệt,

import re
re.search[...]
15 [nhưng không phải là
from re import search
search[...]
53] cũng khớp ngay trước một dòng mới ở cuối chuỗi tìm kiếm

>>>

from re import search
search[...]
7

Trong ví dụ này, về mặt kỹ thuật,

import re
re.search[...]
42 không nằm ở cuối chuỗi tìm kiếm vì nó được theo sau bởi một ký tự xuống dòng bổ sung. Nhưng trình phân tích cú pháp regex vẫn cho phép nó trượt và gọi nó là khớp. Ngoại lệ này không áp dụng cho
from re import search
search[...]
53

import re
re.search[...]
15 và
from re import search
search[...]
53 hoạt động hơi khác nhau ở chế độ
from re import search
search[...]
50. Xem phần bên dưới để biết thêm thông tin về chế độ
from re import search
search[...]
50

from re import search
search[...]
67

Neo kết quả khớp với ranh giới từ

from re import search
search[...]
67 khẳng định rằng vị trí hiện tại của trình phân tích cú pháp regex phải ở đầu hoặc cuối của một từ. Một từ bao gồm một chuỗi các ký tự chữ và số hoặc dấu gạch dưới [
import re
re.search[...]
85], giống như đối với lớp ký tự
import re
re.search[...]
80

>>>

from re import search
search[...]
8

Trong các ví dụ trên, sự trùng khớp xảy ra ở dòng 1 và 3 vì có ranh giới từ ở đầu

import re
re.search[...]
42. Đây không phải là trường hợp ở dòng 6, vì vậy trận đấu không thành công ở đó

Tương tự, có sự trùng khớp ở dòng 9 và 11 vì ranh giới từ tồn tại ở cuối

import re
re.search[...]
71, nhưng không phải ở dòng 14

Sử dụng mỏ neo

from re import search
search[...]
67 ở cả hai đầu của
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 sẽ khiến nó khớp với nhau khi nó xuất hiện trong chuỗi tìm kiếm dưới dạng toàn bộ từ

>>>

from re import search
search[...]
9

Đây là một trường hợp khác trong đó trả tiền để chỉ định

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 làm chuỗi thô, như các ví dụ trên đã thực hiện

Bởi vì

from re import search
search[...]
76 là một chuỗi thoát cho cả ký tự chuỗi và biểu thức chính quy trong Python, nên mỗi lần sử dụng ở trên sẽ cần phải được thoát gấp đôi dưới dạng
from re import search
search[...]
77 nếu bạn không sử dụng chuỗi thô. Đó sẽ không phải là ngày tận thế, nhưng các chuỗi thô sẽ gọn gàng hơn

from re import search
search[...]
78

Neo một kết quả phù hợp với một vị trí không phải là ranh giới từ

from re import search
search[...]
78 làm ngược lại với
from re import search
search[...]
67. Nó khẳng định rằng vị trí hiện tại của trình phân tích cú pháp regex không được ở đầu hoặc cuối của một từ

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
0

Trong trường hợp này, một kết quả trùng khớp xảy ra ở dòng 7 vì không có ranh giới từ nào tồn tại ở đầu hoặc cuối của

import re
re.search[...]
71 trong chuỗi tìm kiếm
from re import search
search[...]
82

Loại bỏ các quảng cáo

định lượng

Một siêu ký tự định lượng ngay sau một phần của

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 và cho biết phần đó phải xuất hiện bao nhiêu lần để khớp thành công

import re
re.search[...]
16

Khớp với 0 hoặc nhiều lần lặp lại của biểu thức chính quy trước đó

Ví dụ:

from re import search
search[...]
85 khớp với 0 hoặc nhiều hơn
import re
re.search[...]
37 ký tự. Điều đó có nghĩa là nó sẽ khớp với một chuỗi rỗng,
import re
re.search[...]
37,
from re import search
search[...]
88,
from re import search
search[...]
89, v.v.

Hãy xem xét những ví dụ này

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
1

Trên dòng 1, không có

from re import search
search[...]
90 ký tự giữa
import re
re.search[...]
71 và
import re
re.search[...]
42. Trên dòng 3 có một và trên dòng 5 có hai. Trình tự siêu ký tự
from re import search
search[...]
93 phù hợp trong cả ba trường hợp

Đôi khi, bạn có thể gặp biểu thức chính quy

from re import search
search[...]
94 trong chương trình Python. Điều này khớp với 0 hoặc nhiều lần xuất hiện của bất kỳ ký tự nào. Nói cách khác, về cơ bản, nó khớp với bất kỳ chuỗi ký tự nào cho đến ngắt dòng. [Hãy nhớ rằng ký tự đại diện
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98 không khớp với ký tự xuống dòng. ]

Trong ví dụ này,

from re import search
search[...]
94 khớp với mọi thứ trong khoảng từ
import re
re.search[...]
71 đến
import re
re.search[...]
42

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
2

Bạn có nhận thấy thông tin

from re import search
search[...]
99 và
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
00 có trong đối tượng khớp không?

Cho đến bây giờ, biểu thức chính quy trong các ví dụ mà bạn đã xem đã chỉ định các đối sánh có độ dài có thể dự đoán được. Sau khi bạn bắt đầu sử dụng các bộ định lượng như

import re
re.search[...]
16, số lượng ký tự khớp có thể thay đổi khá nhiều và thông tin trong đối tượng khớp trở nên hữu ích hơn

Bạn sẽ tìm hiểu thêm về cách truy cập thông tin được lưu trữ trong đối tượng khớp trong phần hướng dẫn tiếp theo của loạt bài này

import re
re.search[...]
17

Khớp với một hoặc nhiều lần lặp lại của biểu thức chính quy trước đó

Điều này tương tự với

import re
re.search[...]
16, nhưng biểu thức chính quy được định lượng phải xảy ra ít nhất một lần

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
3

Hãy nhớ ở trên rằng

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
04 khớp với chuỗi
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
05 bởi vì ký tự phụ
import re
re.search[...]
16 cho phép không có sự xuất hiện nào của
from re import search
search[...]
90. Mặt khác, siêu ký tự
import re
re.search[...]
17 yêu cầu ít nhất một lần xuất hiện của
from re import search
search[...]
90. Điều đó có nghĩa là không có kết quả phù hợp ở dòng 1 trong trường hợp này

import re
re.search[...]
18

Khớp với 0 hoặc một lần lặp lại của biểu thức chính quy trước đó

Một lần nữa, điều này tương tự với

import re
re.search[...]
16 và
import re
re.search[...]
17, nhưng trong trường hợp này chỉ có sự trùng khớp nếu biểu thức chính quy trước đó xảy ra một lần hoặc hoàn toàn không xảy ra

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
4

Trong ví dụ này, có các trận đấu trên dòng 1 và 3. Nhưng ở dòng 5, nơi có hai ký tự

from re import search
search[...]
90, kết quả khớp không thành công

Dưới đây là một số ví dụ khác cho thấy việc sử dụng cả ba siêu ký tự định lượng

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
5

Lần này, biểu thức chính quy được định lượng là lớp ký tự

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
14 thay vì ký tự đơn giản
from re import search
search[...]
90

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
16
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
17
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
18

Các phiên bản không tham lam [hoặc lười biếng] của các bộ định lượng

import re
re.search[...]
16,
import re
re.search[...]
17 và
import re
re.search[...]
18

Khi được sử dụng một mình, các siêu ký tự định lượng

import re
re.search[...]
16,
import re
re.search[...]
17 và
import re
re.search[...]
18 đều tham lam, nghĩa là chúng tạo ra kết quả khớp dài nhất có thể. Hãy xem xét ví dụ này

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
6

Regex

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
25 có nghĩa là

  • Một
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    26 ký tự
  • Khi đó bất kỳ dãy ký tự nào
  • Sau đó, một ký tự
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    27

Nhưng ký tự

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
27 nào?

  1. Cái ngay sau
    import re
    re.search[...]
    
    71
  2. Cái ngay sau
    import re
    re.search[...]
    
    42
  3. Cái ngay sau
    import re
    re.search[...]
    
    43

Vì siêu ký tự

import re
re.search[...]
16 là tham lam nên nó quy định kết quả trùng khớp dài nhất có thể, bao gồm mọi thứ cho đến và bao gồm cả ký tự
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
27 theo sau
import re
re.search[...]
43. Bạn có thể thấy từ đối tượng khớp rằng đây là kết quả khớp được tạo ra

Thay vào đó, nếu bạn muốn kết quả phù hợp ngắn nhất có thể, thì hãy sử dụng chuỗi siêu ký tự không tham lam

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
16

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
7

Trong trường hợp này, trận đấu kết thúc với ký tự

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
27 theo sau
import re
re.search[...]
71

Ghi chú. Bạn có thể hoàn thành điều tương tự với biểu thức chính quy

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
38, có nghĩa là

  • Một
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    26 ký tự
  • Sau đó, bất kỳ chuỗi ký tự nào khác ngoài
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    27
  • Sau đó, một ký tự
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    27

Đây là tùy chọn duy nhất khả dụng với một số trình phân tích cú pháp cũ không hỗ trợ bộ định lượng chậm. Rất may, đó không phải là trường hợp của trình phân tích cú pháp biểu thức chính quy trong mô-đun

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 của Python

Cũng có những phiên bản lười biếng của các bộ định lượng

import re
re.search[...]
17 và
import re
re.search[...]
18

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
8

Hai ví dụ đầu tiên ở dòng 1 và 3 tương tự như ví dụ ở trên, chỉ sử dụng

import re
re.search[...]
17 và
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
17 thay vì
import re
re.search[...]
16 và
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
16

Các ví dụ cuối cùng trên dòng 6 và 8 hơi khác một chút. Nói chung, ký tự phụ

import re
re.search[...]
18 khớp với 0 hoặc 1 lần xuất hiện của biểu thức chính quy trước đó. Phiên bản tham lam,
import re
re.search[...]
18, khớp với một lần xuất hiện, vì vậy,
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
51 khớp với
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52, theo sau là một
import re
re.search[...]
37. Phiên bản không tham lam,
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
18, không khớp với lần xuất hiện nào, vì vậy,
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
55 chỉ khớp với
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
57

So khớp chính xác _______42_______58 lần lặp lại của biểu thức chính quy trước đó

Điều này tương tự với

import re
re.search[...]
16 hoặc
import re
re.search[...]
17, nhưng nó chỉ định chính xác số lần regex trước đó phải xảy ra để khớp thành công

>>>

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
9

Ở đây,

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
61 khớp với
import re
re.search[...]
75, theo sau chính xác là ba trường hợp của ký tự
from re import search
search[...]
90, tiếp theo là một ký tự
import re
re.search[...]
75 khác. Khớp không thành công khi có ít hơn hoặc nhiều hơn ba dấu gạch ngang giữa các ký tự
import re
re.search[...]
75

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
66

Khớp với bất kỳ số lần lặp lại nào của biểu thức chính quy trước đó từ

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58 đến
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
68, bao gồm

Trong ví dụ sau,

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 được định lượng là
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
70. Khớp thành công khi có hai, ba hoặc bốn dấu gạch ngang giữa các ký tự
import re
re.search[...]
75 nhưng không thành công nếu không

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
0

Bỏ qua

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58 ngụ ý giới hạn dưới của
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
73 và bỏ qua
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
68 ngụ ý giới hạn trên không giới hạn

Biểu thức chính quy KhớpGiống với_______42_______75Bất kỳ số lần lặp lại nào của _______0__55 nhỏ hơn hoặc bằng _______42_______68

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
78
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
79bất kỳ số lần lặp lại nào của _______0_______55 lớn hơn hoặc bằng _______42_______58
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
82
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
83bất kỳ số lần lặp lại nào của _______ 0_______55
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
85
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
86

Nếu bạn bỏ qua tất cả

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58,
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
68 và dấu phẩy, thì dấu ngoặc nhọn không còn hoạt động như ký tự đại diện.
import re
re.search[...]
22 chỉ khớp với chuỗi ký tự
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
90

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
1

Trên thực tế, để có bất kỳ ý nghĩa đặc biệt nào, một dãy có dấu ngoặc nhọn phải phù hợp với một trong các mẫu sau trong đó

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58 và
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
68 là các số nguyên không âm

  •  1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    66
  •  1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    94
  •  1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    95
  •  1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    96

Mặt khác, nó phù hợp theo nghĩa đen

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
2

Ở phần sau của hướng dẫn này, khi bạn tìm hiểu về cờ

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
97, bạn sẽ thấy cách bạn có thể xác nhận điều này

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
98

Phiên bản không tham lam [lười biếng] của

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
66

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
66 sẽ khớp với nhiều ký tự nhất có thể và
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
98 sẽ khớp với càng ít ký tự càng tốt

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
3

Trong trường hợp này,

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
02 tạo ra kết quả khớp dài nhất có thể, vì vậy nó khớp với năm ký tự
import re
re.search[...]
37.
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
04 tạo ra kết quả khớp ngắn nhất, vì vậy nó khớp với ba

Loại bỏ các quảng cáo

Nhóm cấu trúc và tham chiếu ngược

Cấu trúc nhóm chia nhỏ biểu thức chính quy trong Python thành các biểu thức con hoặc nhóm. Điều này phục vụ hai mục đích

  1. nhóm. Một nhóm đại diện cho một thực thể cú pháp duy nhất. Các siêu ký tự bổ sung áp dụng cho toàn bộ nhóm dưới dạng một đơn vị
  2. Chụp. Một số cấu trúc nhóm cũng nắm bắt phần của chuỗi tìm kiếm khớp với biểu thức con trong nhóm. Bạn có thể truy xuất các trận đấu đã chụp sau này thông qua một số cơ chế khác nhau

Dưới đây là cách thức hoạt động của nhóm và chụp

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
05

Định nghĩa một biểu thức con hoặc nhóm

Đây là cấu trúc nhóm cơ bản nhất. Biểu thức chính quy trong ngoặc đơn chỉ khớp với nội dung của dấu ngoặc đơn

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
4

Là một biểu thức chính quy, ________ 52 _______ 06 khớp với chuỗi

import re
re.search[...]
42, giống như biểu thức chính quy ________ 52_______08 sẽ không có dấu ngoặc đơn

Đối xử với một nhóm như một đơn vị

Một siêu ký tự định lượng theo sau một nhóm hoạt động trên toàn bộ biểu thức con được chỉ định trong nhóm dưới dạng một đơn vị

Chẳng hạn, ví dụ sau khớp với một hoặc nhiều lần xuất hiện của chuỗi

import re
re.search[...]
42

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
5

Đây là bảng phân tích về sự khác biệt giữa hai biểu thức chính có và không có dấu ngoặc đơn nhóm

RegexInterpretationMatchesVí dụ

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
10Siêu ký tự
import re
re.search[...]
17 chỉ áp dụng cho ký tự
import re
re.search[...]
38.
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
13 theo sau là một hoặc nhiều lần xuất hiện của
import re
re.search[...]
38
import re
re.search[...]
42
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
16
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
17
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
18Siêu ký tự
import re
re.search[...]
17 áp dụng cho toàn bộ chuỗi
import re
re.search[...]
42. Một hoặc nhiều lần xuất hiện của
import re
re.search[...]
42
import re
re.search[...]
42
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
23
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
24

Bây giờ hãy xem một ví dụ phức tạp hơn. Regex

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
25 khớp với
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
26 đến
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
27 lần xuất hiện của một trong hai
import re
re.search[...]
42 hoặc
import re
re.search[...]
43, tùy ý theo sau bởi
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
30

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
6

Ví dụ sau đây cho thấy bạn có thể lồng các dấu ngoặc đơn vào nhóm

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
7

Biểu thức chính quy

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
31 khá phức tạp, vì vậy hãy chia nó thành các phần nhỏ hơn

RegexMatches

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
32
import re
re.search[...]
71 tùy chọn theo sau bởi
import re
re.search[...]
42
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
35Một hoặc nhiều lần xuất hiện của những điều trên
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
36Ba ký tự chữ số thập phân
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
37Không hoặc một lần xuất hiện của điều trên

Chuỗi tất cả lại với nhau và bạn nhận được. ít nhất một lần xuất hiện của

import re
re.search[...]
71 tùy chọn theo sau bởi
import re
re.search[...]
42, tất cả tùy chọn theo sau bởi ba ký tự chữ số thập phân

Như bạn có thể thấy, bạn có thể xây dựng các biểu thức chính quy rất phức tạp trong Python bằng cách sử dụng nhóm các dấu ngoặc đơn

Chụp nhóm

Nhóm không phải là mục đích hữu ích duy nhất mà các cấu trúc nhóm phục vụ. Hầu hết [nhưng không hoàn toàn] cấu trúc nhóm cũng nắm bắt một phần của chuỗi tìm kiếm phù hợp với nhóm. Bạn có thể truy xuất phần đã chụp hoặc tham khảo phần đó sau theo nhiều cách khác nhau

Bạn có nhớ đối tượng khớp mà

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 trả về không? .
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
41 và
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
42

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
43

Trả về một bộ chứa tất cả các nhóm đã bắt được từ một đối sánh biểu thức chính quy

Hãy xem xét ví dụ này

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
8

Mỗi trong số ba biểu thức

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
44 khớp với một chuỗi các ký tự từ. Regex đầy đủ
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
45 ngắt chuỗi tìm kiếm thành ba mã thông báo được phân tách bằng dấu phẩy

Vì các biểu thức

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
44 sử dụng dấu ngoặc đơn nhóm nên các mã thông báo phù hợp tương ứng được ghi lại. Để truy cập các trận đấu đã bắt, bạn có thể sử dụng
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
41, trả về một chứa tất cả các trận đấu đã bắt theo thứ tự

>>>

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
9

Lưu ý rằng bộ dữ liệu chứa mã thông báo nhưng không chứa dấu phẩy xuất hiện trong chuỗi tìm kiếm. Đó là bởi vì các ký tự từ tạo nên mã thông báo nằm trong dấu ngoặc đơn nhóm nhưng dấu phẩy thì không. Dấu phẩy mà bạn thấy giữa các mã thông báo được trả về là dấu phân cách tiêu chuẩn được sử dụng để phân tách các giá trị trong một bộ

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
48

Trả về một chuỗi chứa giá trị khớp đã bắt được

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
49
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
50

Với một đối số,

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
42 trả về một kết quả khớp đã bắt. Lưu ý rằng các đối số là dựa trên một, không dựa trên số không. Vì vậy,
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
52 đề cập đến trận đấu được bắt đầu tiên,
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
53 đến trận đấu thứ hai, v.v.

>>>

>>> s[3:6]
'123'
0

Vì việc đánh số các trận đấu bắt được dựa trên một và không có nhóm nào được đánh số 0, nên

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
54 có một ý nghĩa đặc biệt

>>>

>>> s[3:6]
'123'
1

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
54 trả về toàn bộ trận đấu và
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
56 cũng làm như vậy

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
57

Trả về một bộ chứa các kết quả khớp được chỉ định

Với nhiều đối số,

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
42 trả về một bộ chứa các kết quả khớp được chỉ định theo thứ tự nhất định

>>>

>>> s[3:6]
'123'
2

Đây chỉ là tốc ký thuận tiện. Thay vào đó, bạn có thể tự tạo bộ dữ liệu phù hợp

>>>

>>> s[3:6]
'123'
3

Hai câu lệnh được hiển thị là tương đương về mặt chức năng

phản hồi

Bạn có thể khớp một nhóm đã bắt trước đó sau trong cùng một biểu thức chính quy bằng cách sử dụng một chuỗi siêu ký tự đặc biệt được gọi là tham chiếu ngược

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
59

Khớp với nội dung của một nhóm đã chụp trước đó

Trong một biểu thức chính quy trong Python, chuỗi

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
59, trong đó
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
49 là một số nguyên từ
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
62 đến
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
63, khớp với nội dung của nhóm được bắt

Đây là biểu thức chính quy khớp với một từ, theo sau là dấu phẩy, theo sau lại là cùng một từ

>>>

>>> s[3:6]
'123'
4

Trong ví dụ đầu tiên, ở dòng 3,

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
44 khớp với phiên bản đầu tiên của chuỗi
import re
re.search[...]
71 và lưu nó dưới dạng nhóm được bắt đầu tiên. Dấu phẩy phù hợp với nghĩa đen. Sau đó,
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
68 là một tham chiếu ngược với nhóm được bắt đầu tiên và khớp lại với
import re
re.search[...]
71. Ví dụ thứ hai, ở dòng 9, giống hệt ngoại trừ việc thay vào đó,
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
44 khớp với
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
30

Ví dụ cuối cùng, ở dòng 15, không khớp vì phần đứng trước dấu phẩy không giống với phần đứng sau dấu phẩy, vì vậy tham chiếu ngược

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
68 không khớp

Ghi chú. Bất cứ khi nào bạn sử dụng biểu thức chính quy trong Python với tham chiếu ngược được đánh số, bạn nên chỉ định nó dưới dạng chuỗi thô. Nếu không, trình thông dịch có thể nhầm lẫn phản hồi ngược với giá trị bát phân

Hãy xem xét ví dụ này

>>>

>>> s[3:6]
'123'
5

Regex

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
73 khớp với một chữ cái viết thường, theo sau là
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
74, theo sau là cùng một chữ cái viết thường. Chuỗi trong trường hợp này là
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
75, chuỗi này phải khớp với. Nhưng kết quả khớp không thành công vì Python diễn giải sai tham chiếu ngược
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
68 là ký tự có giá trị bát phân là một

>>>

>>> s[3:6]
'123'
6

Bạn sẽ đạt được kết quả khớp chính xác nếu bạn chỉ định biểu thức chính quy dưới dạng chuỗi thô

>>>

>>> s[3:6]
'123'
7

Hãy nhớ cân nhắc sử dụng chuỗi thô bất cứ khi nào biểu thức chính quy của bạn bao gồm chuỗi siêu ký tự chứa dấu gạch chéo ngược

Phản hồi được đánh số dựa trên một giống như các đối số của

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
42. Chỉ có chín mươi chín nhóm được chụp đầu tiên có thể truy cập được bằng phản hồi. Trình thông dịch sẽ coi
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
78 là ký tự
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
79, có giá trị bát phân là 100

Các cấu trúc nhóm khác

Trình tự siêu ký tự

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
05 được hiển thị ở trên là cách đơn giản nhất để thực hiện nhóm trong biểu thức chính quy trong Python. Phần tiếp theo giới thiệu cho bạn một số cấu trúc nhóm nâng cao cho phép bạn điều chỉnh thời gian và cách thức nhóm xảy ra

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
81

Tạo một nhóm đã được đặt tên

Trình tự siêu ký tự này tương tự như nhóm các dấu ngoặc đơn ở chỗ nó tạo ra một nhóm phù hợp với

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 có thể truy cập được thông qua đối tượng khớp hoặc tham chiếu ngược tiếp theo. Sự khác biệt trong trường hợp này là bạn tham chiếu nhóm phù hợp bằng ký hiệu đã cho
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
83 thay vì theo số của nó

Trước đó, bạn đã thấy ví dụ này với ba nhóm bị bắt được đánh số

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
62,
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
26 và
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
80

>>>

>>> s[3:6]
'123'
8

Những điều sau đây thực sự làm điều tương tự ngoại trừ việc các nhóm có tên tượng trưng

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
87,
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
88 và
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
89

>>>

>>> s[3:6]
'123'
9

Bạn có thể tham khảo các nhóm bị bắt này bằng tên tượng trưng của chúng

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

0

Bạn vẫn có thể truy cập các nhóm có tên tượng trưng theo số nếu muốn

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

1

Bất kỳ

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
83 nào được chỉ định với cấu trúc này phải tuân theo các quy tắc cho a và mỗi
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
83 chỉ có thể xuất hiện một lần cho mỗi biểu thức chính quy

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
92

Khớp với nội dung của một nhóm được đặt tên đã chụp trước đó

Chuỗi siêu ký tự

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
92 là một tham chiếu ngược, tương tự như
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
59, ngoại trừ việc nó đề cập đến một nhóm được đặt tên chứ không phải là một nhóm được đánh số

Đây lại là ví dụ ở trên, sử dụng tham chiếu ngược được đánh số để khớp với một từ, theo sau là dấu phẩy, sau đó lại là cùng một từ

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

2

Thay vào đó, đoạn mã sau thực hiện điều tương tự bằng cách sử dụng một nhóm được đặt tên và một tham chiếu ngược

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

3

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
95 khớp với
import re
re.search[...]
71 và lưu nó thành một nhóm bị bắt tên là
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
97. Một lần nữa, dấu phẩy phù hợp theo nghĩa đen. Sau đó,
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
98 là một phản hồi đối với lần chụp được đặt tên và khớp lại với
import re
re.search[...]
71

Ghi chú. Dấu ngoặc nhọn [

>>> s[3:6]
'123'
00 và
>>> s[3:6]
'123'
01] được yêu cầu khoảng
>>> s[3:6]
'123'
02 khi tạo một nhóm được đặt tên nhưng không phải khi đề cập đến nó sau này, bằng cách phản hồi hoặc bằng cách
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
42

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

4

Ở đây,

>>> s[3:6]
'123'
04
>>> s[3:6]
'123'
05
>>> s[3:6]
'123'
06 tạo nhóm bị bắt. Nhưng phản hồi tương ứng là
>>> s[3:6]
'123'
07_______56_______08
>>> s[3:6]
'123'
09 không có dấu ngoặc nhọn

>>> s[3:6]
'123'
10

Tạo một nhóm không chụp

>>> s[3:6]
'123'
10 giống như
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
05 ở chỗ nó khớp với
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 đã chỉ định. Nhưng
>>> s[3:6]
'123'
10 không ghi lại kết quả khớp để truy xuất sau này

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

5

Trong ví dụ này, từ ở giữa

>>> s[3:6]
'123'
15 nằm trong dấu ngoặc đơn không bắt giữ, do đó, nó bị thiếu trong bộ các nhóm đã bắt giữ. Nó không thể truy xuất được từ đối tượng khớp, cũng như không thể tham chiếu được bằng phản hồi

Tại sao bạn muốn xác định một nhóm nhưng không nắm bắt nó?

Hãy nhớ rằng trình phân tích cú pháp regex sẽ coi các dấu ngoặc đơn nhóm bên trong

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 là một đơn vị. Bạn có thể gặp trường hợp cần tính năng nhóm này, nhưng bạn không cần phải làm bất cứ điều gì với giá trị sau đó, vì vậy bạn không thực sự cần nắm bắt nó. Nếu bạn sử dụng nhóm không bắt giữ, thì bộ các nhóm đã bắt giữ sẽ không bị lộn xộn với các giá trị mà bạn không thực sự cần giữ lại

Ngoài ra, phải mất một thời gian và bộ nhớ để chụp một nhóm. Nếu mã thực hiện so khớp thực thi nhiều lần và bạn không nắm bắt các nhóm mà bạn sẽ không sử dụng sau này, thì bạn có thể thấy một chút lợi thế về hiệu suất

>>> s[3:6]
'123'
17
>>> s[3:6]
'123'
18

Chỉ định đối sánh có điều kiện

Một đối sánh có điều kiện đối sánh với một trong hai biểu thức chính quy được chỉ định tùy thuộc vào việc nhóm đã cho có tồn tại hay không

  • >>> s[3:6]
    '123'
    
    17 đấu với
    >>> s[3:6]
    '123'
    
    20 nếu tồn tại một nhóm đánh số
    >>> if re.search['123', s]:
    ..     print['Found a match.']
    .. else:
    ..     print['No match.']
    ...
    Found a match.
    
    49. Mặt khác, nó khớp với
    >>> s[3:6]
    '123'
    
    22

  • >>> s[3:6]
    '123'
    
    18 đấu với
    >>> s[3:6]
    '123'
    
    20 nếu tồn tại một nhóm có tên
    >>> if re.search['123', s]:
    ..     print['Found a match.']
    .. else:
    ..     print['No match.']
    ...
    Found a match.
    
    83. Mặt khác, nó khớp với
    >>> s[3:6]
    '123'
    
    22

Các đối sánh có điều kiện được minh họa rõ hơn bằng một ví dụ. Hãy xem xét regex này

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

6

Dưới đây là các phần của biểu thức chính quy này được chia nhỏ với một số lời giải thích

  1. >>> s[3:6]
    '123'
    
    27 chỉ ra rằng chuỗi tìm kiếm tùy ý bắt đầu bằng
    >>> s[3:6]
    '123'
    
    28. Nếu đúng như vậy, thì các dấu ngoặc nhóm xung quanh
    >>> s[3:6]
    '123'
    
    29 sẽ tạo ra một nhóm được đánh số
    >>> if re.search['123', s]:
    ..     print['Found a match.']
    .. else:
    ..     print['No match.']
    ...
    Found a match.
    
    62. Nếu không, sẽ không có nhóm như vậy tồn tại
  2. Phần tiếp theo,
    >>> s[3:6]
    '123'
    
    31, thực sự khớp với chuỗi
    import re
    re.search[...]
    
    71
  3. Cuối cùng,
    >>> s[3:6]
    '123'
    
    33 khớp với
    import re
    re.search[...]
    
    42 nếu nhóm
    >>> if re.search['123', s]:
    ..     print['Found a match.']
    .. else:
    ..     print['No match.']
    ...
    Found a match.
    
    62 tồn tại và
    import re
    re.search[...]
    
    43 nếu nhóm này không tồn tại

Các khối mã sau minh họa việc sử dụng biểu thức chính quy trên trong một số đoạn mã Python khác nhau

ví dụ 1

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

7

Chuỗi tìm kiếm

>>> s[3:6]
'123'
37 bắt đầu bằng
>>> s[3:6]
'123'
28, vì vậy trình phân tích cú pháp tạo một nhóm được đánh số
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
62. Trận đấu có điều kiện sau đó là trận đấu với
import re
re.search[...]
42, trận đấu này trận đấu

ví dụ 2

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

8

Chuỗi tìm kiếm

>>> s[3:6]
'123'
41 bắt đầu bằng
>>> s[3:6]
'123'
28, vì vậy trình phân tích cú pháp tạo một nhóm được đánh số
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
62. Trận đấu có điều kiện sau đó là trận đấu với
import re
re.search[...]
42, không trận đấu

ví dụ 3

>>>

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

9

Chuỗi tìm kiếm

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
05 không bắt đầu bằng
>>> s[3:6]
'123'
28, vì vậy không có nhóm được đánh số
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
62. Trận đấu có điều kiện sau đó là trận đấu với
import re
re.search[...]
43, không trận đấu

Ví dụ 4

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

0

Chuỗi tìm kiếm

>>> s[3:6]
'123'
49 không bắt đầu bằng
>>> s[3:6]
'123'
28, vì vậy không có nhóm được đánh số
>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
62. Trận đấu có điều kiện sau đó là trận đấu với
import re
re.search[...]
43, trận đấu này trận đấu

Đây là một kết hợp có điều kiện khác bằng cách sử dụng nhóm được đặt tên thay vì nhóm được đánh số

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

1

Regex này khớp với chuỗi

import re
re.search[...]
71, trước một ký tự không phải từ và theo sau là cùng một ký tự không phải từ hoặc chính chuỗi
import re
re.search[...]
71

Một lần nữa, hãy chia nó thành nhiều mảnh

RegexMatches

import re
re.search[...]
14Phần đầu của chuỗi
>>> s[3:6]
'123'
56Một ký tự không phải là từ, được ghi trong một nhóm có tên
>>> s[3:6]
'123'
57
>>> s[3:6]
'123'
58Không hoặc một lần xuất hiện của chuỗi trên
>>> s[3:6]
'123'
31Chuỗi ký tự
import re
re.search[...]
71
>>> s[3:6]
'123'
61Nội dung của nhóm có tên
>>> s[3:6]
'123'
57 nếu nó tồn tại hoặc chuỗi trống nếu nó không có_______35_______15Phần cuối của chuỗi

Nếu một ký tự không phải từ đứng trước

import re
re.search[...]
71, thì trình phân tích cú pháp sẽ tạo một nhóm có tên là
>>> s[3:6]
'123'
57 chứa ký tự đó. So khớp có điều kiện sau đó so khớp với
>>> s[3:6]
'123'
20, đó là
>>> s[3:6]
'123'
67, lại cùng một ký tự. Điều đó có nghĩa là cùng một nhân vật cũng phải tuân theo
import re
re.search[...]
71 để toàn bộ trận đấu thành công

Nếu

import re
re.search[...]
71 không đứng trước một ký tự không phải từ, thì trình phân tích cú pháp sẽ không tạo nhóm
>>> s[3:6]
'123'
57.
>>> s[3:6]
'123'
22 là chuỗi rỗng, có nghĩa là không được có bất kỳ thứ gì theo sau
import re
re.search[...]
71 để toàn bộ trận đấu thành công. Vì
import re
re.search[...]
14 và
import re
re.search[...]
15 neo toàn bộ biểu thức chính quy, nên chuỗi phải chính xác bằng
import re
re.search[...]
71

Dưới đây là một số ví dụ về các tìm kiếm sử dụng biểu thức chính quy này trong mã Python

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

2

Trên dòng 1, chính nó là

import re
re.search[...]
71. Ở dòng 3 và 5, cùng một ký tự không phải từ đứng trước và theo sau
import re
re.search[...]
71. Như đã quảng cáo, những trận đấu này thành công

Trong các trường hợp còn lại, các trận đấu không thành công

Biểu thức chính quy có điều kiện trong Python khá bí truyền và khó thực hiện. Nếu bạn từng tìm thấy lý do để sử dụng một, thì bạn có thể hoàn thành cùng một mục tiêu với nhiều lệnh gọi

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 riêng biệt và mã của bạn sẽ dễ đọc và hiểu hơn

Loại bỏ các quảng cáo

Xác nhận Lookahead và Lookbehind

Xác nhận nhìn trước và nhìn sau xác định thành công hay thất bại của đối sánh biểu thức chính quy trong Python dựa trên những gì ở ngay phía sau [bên trái] hoặc phía trước [bên phải] vị trí hiện tại của trình phân tích cú pháp trong chuỗi tìm kiếm

Giống như các anchor, các xác nhận lookahead và lookbehind là các xác nhận có độ rộng bằng 0, vì vậy chúng không sử dụng bất kỳ chuỗi tìm kiếm nào. Ngoài ra, mặc dù chúng chứa dấu ngoặc đơn và thực hiện nhóm, nhưng chúng không nắm bắt được những gì chúng khớp

>>> s[3:6]
'123'
79

Tạo ra một khẳng định nhìn về phía trước tích cực

>>> s[3:6]
'123'
79 khẳng định rằng những gì theo sau vị trí hiện tại của trình phân tích cú pháp regex phải khớp với
>>> s[3:6]
'123'
81

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

3

Xác nhận nhìn trước

>>> s[3:6]
'123'
82 xác định rằng những gì theo sau
import re
re.search[...]
71 phải là một ký tự chữ cái viết thường. Trong trường hợp này, đó là ký tự
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52, vì vậy một kết quả khớp được tìm thấy

Mặt khác, trong ví dụ tiếp theo, lookahead không thành công. Ký tự tiếp theo sau

import re
re.search[...]
71 là
import re
re.search[...]
01, vì vậy không có kết quả trùng khớp

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

4

Điểm độc đáo của giao diện tìm kiếm là phần của chuỗi tìm kiếm khớp với

>>> s[3:6]
'123'
81 không được sử dụng và nó không phải là một phần của đối tượng khớp được trả về

Hãy xem lại ví dụ đầu tiên

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

3

Trình phân tích cú pháp regex chỉ xem trước

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52 theo sau
import re
re.search[...]
71 nhưng chưa chuyển qua nó. Bạn có thể biết rằng
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52 không được coi là một phần của đối sánh vì đối tượng khớp hiển thị
>>> s[3:6]
'123'
91

So sánh điều đó với một ví dụ tương tự sử dụng dấu ngoặc đơn nhóm mà không cần xem trước

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

6

Lần này, regex tiêu thụ

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52 và nó trở thành một phần của trận đấu cuối cùng

Đây là một ví dụ khác minh họa cách nhìn về phía trước khác với biểu thức chính quy thông thường trong Python

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

7

Trong lần tìm kiếm đầu tiên, trên dòng 1, trình phân tích cú pháp tiến hành như sau

  1. Phần đầu tiên của biểu thức chính quy,
    >>> s[3:6]
    '123'
    
    31, khớp và sử dụng
    import re
    re.search[...]
    
    71 từ chuỗi tìm kiếm
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    05
  2. Phần tiếp theo,
    >>> s[3:6]
    '123'
    
    82, là một giao diện phù hợp với
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    52, nhưng trình phân tích cú pháp không chuyển qua phần
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    52
  3. Cuối cùng,
    >>> s[3:6]
    '123'
    
    99 khớp với ký tự đơn tiếp theo có sẵn, đó là
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    52 và nắm bắt nó trong một nhóm có tên
    >>> s[3:6]
    '123'
    
    57

Cuộc gọi

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

02 xác nhận rằng nhóm có tên
>>> s[3:6]
'123'
57 chứa
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52

So sánh điều đó với tìm kiếm trên dòng 5, không chứa tìm kiếm phía trước

  1. Như trong ví dụ đầu tiên, phần đầu tiên của biểu thức chính quy,
    >>> s[3:6]
    '123'
    
    31, khớp và sử dụng
    import re
    re.search[...]
    
    71 từ chuỗi tìm kiếm
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    05
  2. Phần tiếp theo,
    >>> s = 'foo123bar'
    >>> re.search['[0-9][0-9][0-9]', s]
    
    
    08, khớp và sử dụng
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    52, và trình phân tích cú pháp tiến qua
     1>>> s = 'foo123bar'
     2
     3>>> # One last reminder to import!
     4>>> import re
     5
     6>>> re.search['123', s]
     7
    
    52
  3. Cuối cùng,
    >>> s[3:6]
    '123'
    
    99 khớp với ký tự đơn tiếp theo có sẵn, ký tự này hiện là
    import re
    re.search[...]
    
    37

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

02 xác nhận rằng, trong trường hợp này, nhóm có tên
>>> s[3:6]
'123'
57 chứa
import re
re.search[...]
37

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

16

Tạo một xác nhận nhìn trước tiêu cực

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

16 khẳng định rằng những gì theo sau vị trí hiện tại của trình phân tích cú pháp regex không được khớp với
>>> s[3:6]
'123'
81

Dưới đây là các ví dụ về cái nhìn tích cực mà bạn đã thấy trước đó, cùng với các ví dụ về cái nhìn tiêu cực của chúng

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

8

Các xác nhận nhìn trước phủ định trên các dòng 3 và 8 quy định rằng những gì theo sau

import re
re.search[...]
71 không được là một ký tự chữ cái viết thường. Điều này không thành công ở dòng 3 nhưng thành công ở dòng 8. Điều này trái ngược với những gì đã xảy ra với các xác nhận nhìn trước tích cực tương ứng

Giống như với một cái nhìn tích cực, những gì phù hợp với một cái nhìn tiêu cực không phải là một phần của đối tượng so khớp được trả về và không được sử dụng

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

20

Tạo ra một khẳng định về cái nhìn tích cực

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

20 khẳng định rằng những gì đứng trước vị trí hiện tại của trình phân tích cú pháp regex phải khớp với
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

22

Trong ví dụ sau, xác nhận phía sau xác định rằng

import re
re.search[...]
71 phải đứng trước
import re
re.search[...]
42

>>>

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

9

Đây là trường hợp ở đây, vì vậy trận đấu thành công. Như với các xác nhận nhìn trước, một phần của chuỗi tìm kiếm phù hợp với giao diện không trở thành một phần của kết quả khớp cuối cùng

Ví dụ tiếp theo không khớp vì giao diện phía sau yêu cầu

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
30 trước
import re
re.search[...]
42

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
0

Có một hạn chế đối với các xác nhận nhìn sau không áp dụng cho các xác nhận nhìn trước.

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

22 trong xác nhận nhìn lại phải chỉ định đối sánh có độ dài cố định

Ví dụ: điều sau đây không được phép vì độ dài của chuỗi khớp với

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

28 là không xác định

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
1

Tuy nhiên, điều này không sao

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
2

Bất cứ thứ gì khớp với

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

29 sẽ có độ dài cố định là ba, vì vậy, ____68_______29 là hợp lệ trong một xác nhận phía sau

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

31

Tạo một xác nhận lookbehind tiêu cực

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

31 khẳng định rằng những gì đứng trước vị trí hiện tại của trình phân tích cú pháp regex không được khớp với
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

22

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
3

Cũng giống như xác nhận có cái nhìn tích cực,

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

22 phải chỉ định đối sánh có độ dài cố định

Loại bỏ các quảng cáo

Các siêu ký tự khác

Có một vài trình tự metacharacter để trang trải. Đây là những siêu ký tự đi lạc rõ ràng không thuộc bất kỳ danh mục nào đã được thảo luận

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

35

Chỉ định một nhận xét

Trình phân tích cú pháp regex bỏ qua mọi thứ có trong chuỗi

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

35

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
4

Điều này cho phép bạn chỉ định tài liệu bên trong biểu thức chính quy trong Python, điều này có thể đặc biệt hữu ích nếu biểu thức chính quy đặc biệt dài

Thanh dọc, hoặc ống [

import re
re.search[...]
25]

Chỉ định một tập hợp các lựa chọn thay thế để khớp

Một biểu thức có dạng _______68_______38

>>> if re.search['123', s]:
..     print['Found a match.']
.. else:
..     print['No match.']
...
Found a match.
62
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

40____52_______26
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

42
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
68
>>> s[3:6]
'123'
01 phù hợp với nhiều nhất một trong các biểu thức
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

38
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

46
>>> s[3:6]
'123'
01

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
5

Ở đây,

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

48 sẽ khớp với bất kỳ số nào trong số
import re
re.search[...]
71,
import re
re.search[...]
42 hoặc
import re
re.search[...]
43. Bạn có thể tách bất kỳ số lượng biểu thức chính nào bằng cách sử dụng
import re
re.search[...]
25

Luân phiên không tham lam. Trình phân tích cú pháp regex xem xét các biểu thức được phân tách bằng

import re
re.search[...]
25 theo thứ tự từ trái sang phải và trả về kết quả khớp đầu tiên mà nó tìm thấy. Các biểu thức còn lại không được kiểm tra, ngay cả khi một trong số chúng sẽ tạo ra kết quả khớp dài hơn

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
6

Trong trường hợp này, mẫu được chỉ định trên dòng 6,

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

54, sẽ khớp với
import re
re.search[...]
71 hoặc
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

56. Kết quả trùng khớp được trả về là
import re
re.search[...]
71 vì nó xuất hiện đầu tiên khi quét từ trái sang phải, mặc dù
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

56 sẽ là kết quả khớp dài hơn

Bạn có thể kết hợp xen kẽ, nhóm và bất kỳ siêu ký tự nào khác để đạt được bất kỳ mức độ phức tạp nào bạn cần. Trong ví dụ sau,

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

59 có nghĩa là một chuỗi gồm một hoặc nhiều chuỗi
import re
re.search[...]
71,
import re
re.search[...]
42 hoặc
import re
re.search[...]
43

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
7

Trong ví dụ tiếp theo,

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

63 có nghĩa là một chuỗi gồm một hoặc nhiều ký tự chữ số thập phân hoặc một chuỗi gồm một hoặc nhiều ký tự
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

64

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
8

Với tất cả các siêu ký tự mà mô-đun

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 hỗ trợ, bầu trời thực tế là có giới hạn

Thế thôi mọi người

Điều đó hoàn thành chuyến tham quan của chúng tôi về các siêu ký tự biểu thức chính quy được hỗ trợ bởi mô-đun

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 của Python. [Trên thực tế, không hoàn toàn như vậy—có một vài yếu tố khác mà bạn sẽ tìm hiểu bên dưới trong phần thảo luận về cờ. ]

Có rất nhiều thứ để hiểu, nhưng một khi bạn đã quen với cú pháp regex trong Python, độ phức tạp của khớp mẫu mà bạn có thể thực hiện là gần như vô hạn. Những công cụ này rất hữu ích khi bạn đang viết mã để xử lý dữ liệu văn bản

Nếu bạn chưa quen với biểu thức chính quy và muốn thực hành nhiều hơn khi làm việc với chúng hoặc nếu bạn đang phát triển một ứng dụng sử dụng biểu thức chính quy và bạn muốn thử nghiệm nó một cách tương tác, thì hãy xem trang web 101 Biểu thức chính quy. Nó thực sự mát mẻ

Loại bỏ các quảng cáo

Khớp biểu thức chính quy đã sửa đổi với cờ

Hầu hết các hàm trong mô-đun

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 đều nhận một đối số tùy chọn
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
59. Điều này bao gồm chức năng mà bạn hiện rất quen thuộc,
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

70

Quét một chuỗi để tìm đối sánh regex, áp dụng công cụ sửa đổi được chỉ định

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
59

Các cờ sửa đổi hành vi phân tích cú pháp regex, cho phép bạn tinh chỉnh hơn nữa việc khớp mẫu của mình

Supported Regular Expression Flags

The table below briefly summarizes the available flags. All flags except

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

72 have a short, single-letter name and also a longer, full-word name

Short NameLong NameEffect

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

73
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

74Makes matching of alphabetic characters case-insensitive
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

75
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

76Causes start-of-string and end-of-string anchors to match embedded newlines
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

77
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

78Causes the dot metacharacter to match a newline
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

79
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

80Allows inclusion of whitespace and comments within a regular expression
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
82
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

72Causes the regex parser to display debugging information to the console
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

83
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

84Specifies ASCII encoding for character classification
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

85
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

86Specifies Unicode encoding for character classification
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

87                            
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

88Specifies encoding for character classification based on the current locale

The following sections describe in more detail how these flags affect matching behavior

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

73
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

74

Makes matching case insensitive

When

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

91 is in effect, character matching is case insensitive

>>>

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
9

In the search on line 1,

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

28 matches only the first three characters of
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

93. Similarly, on line 3,
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

94 matches only the last three characters. But in the subsequent searches, the parser ignores case, so both
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

28 and
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

94 match the entire string

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

91 affects alphabetic matching involving character classes as well

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
00

When case is significant, the longest portion of

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

98 that
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

99 matches is just the initial
import re
re.search[...]
37. Specifying
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

73 makes the search case insensitive, so
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

99 matches the entire string

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

75
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

76

Causes start-of-string and end-of-string anchors to match at embedded newlines

By default, the

import re
re.search[...]
14 [start-of-string] and
import re
re.search[...]
15 [end-of-string] anchors match only at the beginning and end of the search string

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
01

In this case, even though the search string

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

07 contains embedded newline characters, only
import re
re.search[...]
71 matches when anchored at the beginning of the string, and only
import re
re.search[...]
43 matches when anchored at the end

If a string has embedded newlines, however, you can think of it as consisting of multiple internal lines. In that case, if the

from re import search
search[...]
50 flag is set, the
import re
re.search[...]
14 and
import re
re.search[...]
15 anchor metacharacters match internal lines as well

  • import re
    re.search[...]
    
    14 matches at the beginning of the string or at the beginning of any line within the string [that is, immediately following a newline]
  • import re
    re.search[...]
    
    15 matches at the end of the string or at the end of any line within the string [immediately preceding a newline]

The following are the same searches as shown above

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
02

In the string

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

07, all three of
import re
re.search[...]
71,
import re
re.search[...]
42, and
import re
re.search[...]
43 occur at either the start or end of the string or at the start or end of a line within the string. With the
from re import search
search[...]
50 flag set, all three match when anchored with either
import re
re.search[...]
14 or
import re
re.search[...]
15

Note. The

from re import search
search[...]
50 flag only modifies the
import re
re.search[...]
14 and
import re
re.search[...]
15 anchors in this way. It doesn’t have any effect on the
from re import search
search[...]
41 and
from re import search
search[...]
53 anchors

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
03

On lines 3 and 5, the

import re
re.search[...]
14 and
import re
re.search[...]
15 anchors dictate that
import re
re.search[...]
42 must be found at the start and end of a line. Specifying the
from re import search
search[...]
50 flag makes these matches succeed

The examples on lines 8 and 10 use the

from re import search
search[...]
41 and
from re import search
search[...]
53 flags instead. You can see that these matches fail even with the
from re import search
search[...]
50 flag in effect

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

77
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

78

Causes the dot [

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
98] metacharacter to match a newline

Remember that by default, the dot metacharacter matches any character except the newline character. The

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

37 flag lifts this restriction

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
04

In this example, on line 1 the dot metacharacter doesn’t match the newline in

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

38. On lines 3 and 5,
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

37 is in effect, so the dot does match the newline. Note that the short name of the
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

37 flag is
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

77, not
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

42 as you might expect

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

79
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

80

Allows inclusion of whitespace and comments within a regex

The

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

45 flag specifies a few special behaviors

  • The regex parser ignores all whitespace unless it’s within a character class or escaped with a backslash

  • If the regex contains a

    import re
    re.search[...]
    
    28 character that isn’t contained within a character class or escaped with a backslash, then the parser ignores it and all characters to the right of it

What’s the use of this? It allows you to format a regex in Python so that it’s more readable and self-documenting

Here’s an example showing how you might put this to use. Suppose you want to parse phone numbers that have the following format

  • Mã vùng ba chữ số tùy chọn, trong ngoặc đơn
  • Optional whitespace
  • Three-digit prefix
  • Separator [either
    from re import search
    search[...]
    
    90 or
    from re import search
    search[...]
    
    25]
  • Four-digit line number

The following regex does the trick

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
05

But

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

49 is an eyeful, isn’t it? Using the
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

45 flag, you can write the same regex in Python like this instead

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
06

The

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 calls are the same as those shown above, so you can see that this regex works the same as the one specified earlier. But it’s less difficult to understand at first glance

Note that triple quoting makes it particularly convenient to include embedded newlines, which qualify as ignored whitespace in

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

45 mode

When using the

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

45 flag, be mindful of whitespace that you do intend to be significant. Consider these examples

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
07

After all you’ve seen to this point, you may be wondering why on line 4 the regex

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

54 doesn’t match the string
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

55. It doesn’t because the
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

45 flag causes the parser to ignore the space character

To make this match as expected, escape the space character with a backslash or include it in a character class, as shown on lines 7 and 9

As with the

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

37 flag, note that the
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

45 flag has a non-intuitive short name.
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

79, not
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

60

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

72

Displays debugging information

The

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
97 flag causes the regex parser in Python to display debugging information about the parsing process to the console

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
08

When the parser displays

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

63 in the debugging output, it’s showing the ASCII code of a literal character in the regex. In this case, the literal characters are
import re
re.search[...]
61,
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

65,
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

65 and
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
52,
import re
re.search[...]
37,
import re
re.search[...]
38

Here’s a more complicated example. This is the phone number regex shown in the discussion on the

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

45 flag earlier

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
09

This looks like a lot of esoteric information that you’d never need, but it can be useful. See the Deep Dive below for a practical application

Deep Dive. Debugging Regular Expression Parsing

As you know from above, the metacharacter sequence

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
66 indicates a specific number of repetitions. It matches anywhere from
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58 to
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
68 repetitions of what precedes it

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
10

You can verify this with the

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
97 flag

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
11

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

75 confirms that the regex parser recognizes the metacharacter sequence
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

76 and interprets it as a range quantifier

But, as noted previously, if a pair of curly braces in a regex in Python contains anything other than a valid number or numeric range, then it loses its special meaning

You can verify this also

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
12

You can see that there’s no

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

77 token in the debug output. The
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

78 tokens indicate that the parser treats
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

79 literally and not as a quantifier metacharacter sequence.
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
69,
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

81,
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

82,
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

82, and
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

84 are the ASCII codes for the characters in the literal string
>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

85

Information displayed by the

 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
97 flag can help you troubleshoot by showing you how the parser is interpreting your regex

Curiously, the

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 module doesn’t define a single-letter version of the
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
97 flag. You could define your own if you wanted to

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
13

Nhưng điều này có thể gây nhầm lẫn hơn là hữu ích, vì người đọc mã của bạn có thể hiểu sai nó là chữ viết tắt của cờ

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

37. Nếu bạn đã thực hiện bài tập này, bạn nên ghi lại kỹ lưỡng

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

83
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

84
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

85
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

86
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

87
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

88

Chỉ định mã hóa ký tự được sử dụng để phân tích cú pháp các lớp ký tự regex đặc biệt

Một số trình tự siêu ký tự regex [

import re
re.search[...]
80,
import re
re.search[...]
81,
from re import search
search[...]
67,
from re import search
search[...]
78,
import re
re.search[...]
92,
import re
re.search[...]
93,
from re import search
search[...]
00 và
from re import search
search[...]
01] yêu cầu bạn chỉ định các ký tự cho các lớp nhất định như từ, chữ số hoặc khoảng trắng. Các cờ trong nhóm này xác định sơ đồ mã hóa được sử dụng để gán các ký tự cho các lớp này. Các mã hóa có thể là ASCII, Unicode hoặc theo ngôn ngữ hiện tại

You had a brief introduction to character encoding and Unicode in the tutorial on Strings and Character Data in Python, under the discussion of the . For more in-depth information, check out these resources

  • Unicode & Character Encodings in Python. A Painless Guide

Why is character encoding so important in the context of regexes in Python? Here’s a quick example

You learned earlier that

import re
re.search[...]
92 specifies a single digit character. The description of the
import re
re.search[...]
92 metacharacter sequence states that it’s equivalent to the character class
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
91. That happens to be true for English and Western European languages, but for most of the world’s languages, the characters
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
92 through
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
93 don’t represent all or even any of the digits

For example, here’s a string that consists of three

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
14

For the regex parser to properly account for the Devanagari script, the digit metacharacter sequence

import re
re.search[...]
92 must match each of these characters as well

The Unicode Consortium created Unicode to handle this problem. Unicode is a character-encoding standard designed to represent all the world’s writing systems. All strings in Python 3, including regexes, are Unicode by default

So then, back to the flags listed above. These flags help to determine whether a character falls into a given class by specifying whether the encoding used is ASCII, Unicode, or the current locale

  • >>> s = 'foo123bar'
    >>> re.search['[0-9][0-9][0-9]', s]
    
    
    85 and
    >>> s = 'foo123bar'
    >>> re.search['[0-9][0-9][0-9]', s]
    
    
    86 specify Unicode encoding. Unicode is the default, so these flags are superfluous. They’re mainly supported for backward compatibility
  • >>> s = 'foo123bar'
    >>> re.search['[0-9][0-9][0-9]', s]
    
    
    83 and
    >>> s = 'foo123bar'
    >>> re.search['[0-9][0-9][0-9]', s]
    
    
    84 force a determination based on ASCII encoding. If you happen to be operating in English, then this is happening anyway, so the flag won’t affect whether or not a match is found
  • >>> s = 'foo123bar'
    >>> re.search['[0-9][0-9][0-9]', s]
    
    
    87 and
    >>> s = 'foo123bar'
    >>> re.search['[0-9][0-9][0-9]', s]
    
    
    88 make the determination based on the current locale. Locale is an outdated concept and isn’t considered reliable. Except in rare circumstances, you’re not likely to need it

Using the default Unicode encoding, the regex parser should be able to handle any language you throw at it. In the following example, it correctly recognizes each of the characters in the string

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
17 as a digit

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
15

Here’s another example that illustrates how character encoding can affect a regex match in Python. Consider this string

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
16

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
18 [the German word for pretty or nice] contains the
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
19 character, which has the 16-bit hexadecimal Unicode value
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
20. This character isn’t representable in traditional 7-bit ASCII

If you’re working in German, then you should reasonably expect the regex parser to consider all of the characters in

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
18 to be word characters. But take a look at what happens if you search
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34 for word characters using the
import re
re.search[...]
80 character class and force an ASCII encoding

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
17

When you restrict the encoding to ASCII, the regex parser recognizes only the first three characters as word characters. The match stops at

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
19

On the other hand, if you specify

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

86 or allow the encoding to default to Unicode, then all the characters in
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
18 qualify as word characters

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
18

The

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
27 and
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
28 flags are available in case you need them for special circumstances. But in general, the best strategy is to use the default Unicode encoding. This should handle any world language correctly

Combining
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
59 Arguments in a Function Call

Flag values are defined so that you can combine them using the [

import re
re.search[...]
25] operator. This allows you to specify several flags in a single function call

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
19

This

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33 call uses bitwise OR to specify both the
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

91 and
from re import search
search[...]
50 flags at once

Setting and Clearing Flags Within a Regular Expression

Ngoài việc có thể chuyển đối số

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
59 cho hầu hết các lệnh gọi hàm mô-đun
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32, bạn cũng có thể sửa đổi các giá trị cờ trong biểu thức chính quy trong Python. There are two regex metacharacter sequences that provide this capability

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
36

Sets flag value[s] for the duration of a regex

Within a regex, the metacharacter sequence

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
36 sets the specified flags for the entire expression

Giá trị của

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
59 là một hoặc nhiều chữ cái từ bộ
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
39,
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

46,
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
41,
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58,
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34,
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
44 và
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
45. Here’s how they correspond to the
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 module flags

LetterFlags

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
39
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

83    
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

84
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

46
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

73    
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

74
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
41
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

87    
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

88
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

75    
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

76
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

77    
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

78
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
44
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

85    
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

86
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
45
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

79    
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

80

The

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
36 metacharacter sequence as a whole matches the empty string. It always matches successfully and doesn’t consume any of the search string

The following examples are equivalent ways of setting the

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

91 and
from re import search
search[...]
50 flags

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
20

Note that a

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
36 metacharacter sequence sets the given flag[s] for the entire regex no matter where you place it in the expression

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
21

In the above examples, both dot metacharacters match newlines because the

>>> re.search['[0-9][0-9][0-9]', 'foo456bar']


>>> re.search['[0-9][0-9][0-9]', '234baz']


>>> re.search['[0-9][0-9][0-9]', 'qux678']

37 flag is in effect. This is true even when
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
73 appears in the middle or at the end of the expression

As of Python 3. 7, it’s deprecated to specify

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
36 anywhere in a regex other than at the beginning

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
22

It still produces the appropriate match, but you’ll get a warning message

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
75

Sets or removes flag value[s] for the duration of a group

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
75 defines a non-capturing group that matches against
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55. For the
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
55 contained in the group, the regex parser sets any flags specified in
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
79 and clears any flags specified in
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
80

Values for

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
79 and
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
80 are most commonly
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

46,
 1>>> s = 'foo123bar'
 2
 3>>> # One last reminder to import!
 4>>> import re
 5
 6>>> re.search['123', s]
 7
58,
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
34 or
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
45

In the following example, the

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

91 flag is set for the specified group

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
23

This produces a match because

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
88 dictates that the match against
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
89 is case insensitive

Now contrast that with this example

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
24

As in the previous example, the match against

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
89 would succeed because it’s case insensitive. But once outside the group,
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

91 is no longer in effect, so the match against
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
92 is case sensitive and fails

Here’s an example that demonstrates turning a flag off for a group

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
25

Again, there’s no match. Although

>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

74 enables case-insensitive matching for the entire call, the metacharacter sequence
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
94 turns off
>>> s = 'foo123bar'
>>> re.search['[0-9][0-9][0-9]', s]

91 for the duration of that group, so the match against
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
89 fails

As of Python 3. 7, you can specify

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
44,
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
39, or
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
41 as
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
79 to override the default encoding for the specified group

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
26

You can only set encoding this way, though. You can’t remove it

>>>

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
27

>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
44,
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
39, and
>>> print[re.search['[0-9][0-9][0-9]', '12foo34']]
None
41 are mutually exclusive. Only one of them may appear per group

Conclusion

This concludes your introduction to regular expression matching and Python’s

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 module. Congratulations. You’ve mastered a tremendous amount of material

You now know how to

  • Use
    >>> s = 'foo123bar'
    >>> s.find['123']
    3
    >>> s.index['123']
    3
    
    33 to perform regex matching in Python
  • Create complex pattern matching searches with regex metacharacters
  • Tweak regex parsing behavior with flags

But you’ve still seen only one function in the module.

>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
33. The
>>> s = 'foo123bar'
>>> s.find['123']
3
>>> s.index['123']
3
32 module has many more useful functions and objects to add to your pattern-matching toolkit. The next tutorial in the series will introduce you to what else the regex module in Python has to offer

« Functions in Python

Regular Expressions. Regexes in Python [Part 2] »

Mark as Completed

Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding. Biểu thức chính quy và xây dựng biểu thức chính quy trong Python

🐍 Python Tricks 💌

Get a short & sweet Python Trick delivered to your inbox every couple of days. No spam ever. Unsubscribe any time. Curated by the Real Python team

Send Me Python Tricks »

Giới thiệu về John Sturtz

John is an avid Pythonista and a member of the Real Python tutorial team

» Thông tin thêm về John

Each tutorial at Real Python is created by a team of developers so that it meets our high quality standards. The team members who worked on this tutorial are

Aldren

Jim

Joanna

Jacob

Master Real-World Python Skills With Unlimited Access to Real Python

Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert Pythonistas

Level Up Your Python Skills »

Master Real-World Python Skills
With Unlimited Access to Real Python

Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert Pythonistas

Level Up Your Python Skills »

What Do You Think?

Rate this article

Tweet Share Share Email

What’s your #1 takeaway or favorite thing you learned? How are you going to put your newfound skills to use? Leave a comment below and let us know

Commenting Tips. The most useful comments are those written with the goal of learning from or helping out other students. and get answers to common questions in our support portal

What is the meaning of import re?

Re-importation or reimportation is the importation of goods into a country which had previously been exported from that country .

What is the re function in Python?

The Python "re" module provides regular expression support . In Python a regular expression search is typically written as. match = re. search[pat, str] The re. search[] method takes a regular expression pattern and a string and searches for that pattern within the string.

Làm cách nào để cài đặt lại trong Python?

Type "cmd" in the search bar and hit Enter to open the command line. What is this? Type “ pip install regex ” [without quotes] in the command line and hit Enter again . This installs regex for your default Python installation.

What does re search return in Python?

Lại. hàm search[] sẽ tìm kiếm mẫu biểu thức chính quy và trả về lần xuất hiện đầu tiên . Unlike Python re. match[], it will check all lines of the input string. If the pattern is found, the match object will be returned, otherwise “null” is returned.

Chủ Đề