Python - Regular Expressions

Biểu thức chính quy là một chuỗi ký tự đặc biệt giúp bạn khớp hoặc tìm các chuỗi khác hoặc tập hợp các chuỗi, sử dụng cú pháp chuyên biệt được giữ trong một mẫu. Biểu thức chính quy thường được biết đến với tên gọi regex hoặc regexp.

Thông thường, các mẫu như vậy được sử dụng bởi các thuật toán tìm kiếm chuỗi cho các thao tác "tìm" hoặc "tìm và thay thế" trên chuỗi, hoặc để xác thực đầu vào.

Xử lý văn bản quy mô lớn trong các dự án khoa học dữ liệu yêu cầu thao tác với dữ liệu văn bản. Việc xử lý biểu thức chính quy được hỗ trợ bởi nhiều ngôn ngữ lập trình, bao gồm cả Python. Thư viện chuẩn của Python có mô-đun re cho mục đích này.

Vì hầu hết các hàm được định nghĩa trong mô-đun re hoạt động với chuỗi thô, hãy để chúng ta trước tiên hiểu chuỗi thô là gì.

Raw Strings

Biểu thức chính quy sử dụng ký tự backslash ('\') để chỉ định các dạng đặc biệt hoặc để cho phép các ký tự đặc biệt được sử dụng mà không kích hoạt ý nghĩa đặc biệt của chúng. Mặt khác, Python sử dụng ký tự này như một ký tự thoát. Do đó, Python sử dụng ký hiệu chuỗi thô.

Một chuỗi trở thành chuỗi thô nếu nó được thêm tiền tố bằng r hoặc R trước các ký hiệu ngoặc kép. Do đó, 'Hello' là một chuỗi bình thường trong khi r'Hello' là một chuỗi thô.

>>> normal="Hello"
>>> print (normal)
Hello
>>> raw=r"Hello"
>>> print (raw)
Hello

Trong điều kiện bình thường, không có sự khác biệt nào giữa hai loại. Tuy nhiên, khi ký tự thoát được nhúng trong chuỗi, chuỗi bình thường thực sự sẽ hiểu chuỗi thoát, trong khi chuỗi thô thì không xử lý ký tự thoát.

>>> normal="Hello\nWorld"
>>> print (normal)
Hello
World
>>> raw=r"Hello\nWorld"
>>> print (raw)
Hello\nWorld

Trong ví dụ trên, khi một chuỗi bình thường được in ra, ký tự thoát '\n' được xử lý để tạo ra một dòng mới. Tuy nhiên, vì có toán tử chuỗi thô 'r', tác động của ký tự thoát không được dịch theo nghĩa của nó.

Metacharacters

Hầu hết các chữ cái và ký tự sẽ chỉ khớp với chính chúng. Tuy nhiên, một số ký tự là ký tự đặc biệt (metacharacters) và không khớp với chính chúng. Ký tự meta là những ký tự có ý nghĩa đặc biệt, tương tự như * trong ký tự đại diện (wild card).

Dưới đây là danh sách đầy đủ các ký tự đặc biệt (metacharacters) −

. ^ $ * + ? { } [ ] \ | ( )

Các ký hiệu dấu ngoặc vuông [ và ] chỉ ra một tập hợp các ký tự mà bạn muốn khớp. Các ký tự có thể được liệt kê riêng lẻ, hoặc dưới dạng một khoảng ký tự bằng cách ngăn cách chúng bằng dấu '-'.

Sr.No. Metacharacters & Description
1 [abc] match any of the characters a, b, or c
2 [a-c] which uses a range to express the same set of characters.
3 [a-z] match only lowercase letters.
4 [0-9] match only digits.
5 '^' complements the character set in [].[^5] will match any character except'5'.

'\' là một ký tự điều khiển thoát. Khi được theo sau bởi các ký tự khác nhau, nó tạo thành các chuỗi đặc biệt khác nhau. Nếu bạn cần khớp với một [ hoặc \, bạn có thể đặt trước chúng bằng một dấu gạch chéo ngược để loại bỏ ý nghĩa đặc biệt của chúng: \[ hoặc \\.

Các tập hợp ký tự đã được định nghĩa trước, được biểu thị bởi các chuỗi đặc biệt bắt đầu bằng '\' như sau:

Sr.No. Metacharacters & Description
1 \d Matches any decimal digit; this is equivalent to the class [0-9].
2 \D Matches any non-digit character; this is equivalent to the class [^0-9].
3 \s Matches any whitespace character; this is equivalent to the class [\t\n\r\f\v].
4 \S Matches any non-whitespace character; this is equivalent to the class [^\t\n\r\f\v].
5 \w Matches any alphanumeric character; this is equivalent to the class [a-zAZ0-9_].
6 \W Matches any non-alphanumeric character. equivalent to the class [^a-zAZ0-9_].
7 . Matches with any single character except newline '\n'.
8 ? match 0 or 1 occurrence of the pattern to its left
9 + 1 or more occurrences of the pattern to its left
10 * 0 or more occurrences of the pattern to its left
11 \b boundary between word and non-word and /B is opposite of /b
12 [..] Matches any single character in a square bracket and [^..] matches any single character not in square bracket.
13 \ It is used for special meaning characters like \. to match a period or \+ for plus sign.
14 {n,m} Matches at least n and at most m occurrences of preceding
15 a| b Matches either a or b

Mô-đun re của Python cung cấp các hàm hữu ích để tìm kiếm sự khớp, tìm kiếm một mẫu, và thay thế một chuỗi đã khớp bằng một chuỗi khác, v.v.

The re.match() Function

Hàm này cố gắng khớp mẫu RE pattern ở đầu string với các flags tùy chọn. Dưới đây là syntax cho hàm này −

re.match(pattern, string, flags=0)

Dưới đây là mô tả về các tham số −

Sr.No. Parameter & Description
1 pattern This is the regular expression to be matched.
2 String This is the string, which would be searched to match the pattern at the beginning of string.
3 Flags You can specify different flags using bitwise OR (|). These are modifiers, which are listed in the table below.

Hàm re.match() trả về một đối tượng match khi thành công, None khi thất bại. Một thể hiện của đối tượng khớp chứa thông tin về sự khớp: nó bắt đầu và kết thúc ở đâu, chuỗi con mà nó khớp, v.v.

Phương thức start() của đối tượng match trả về vị trí bắt đầu của mẫu trong chuỗi, và end() trả về vị trí kết thúc.

Nếu không tìm thấy mẫu, đối tượng khớp sẽ là None.

Chúng tôi sử dụng hàm group(num) hoặc groups() của đối tượng match để lấy biểu thức khớp.

Sr.No. Match Object Methods & Description
1 group(num=0) This method returns entire match (or specific subgroup num)
2 groups() This method returns all matching subgroups in a tuple (empty if there weren't any)

Example

import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'Cats', line)
print (matchObj.start(), matchObj.end())
print ("matchObj.group() : ", matchObj.group())

Nó sẽ sản xuất output

0 4
matchObj.group() : Cats

The re.search() Function

Hàm này tìm kiếm lần xuất hiện đầu tiên của mẫu RE pattern trong string , với các flags tùy chọn. Dưới đây là syntax cho hàm này −

re.search(pattern, string, flags=0)

Dưới đây là mô tả về các tham số −

Sr.No. Parameter & Description
1 Pattern This is the regular expression to be matched.
2 String This is the string, which would be searched to match the pattern anywhere in the string.
3 Flags You can specify different flags using bitwise OR (|). These are modifiers, which are listed in the table below.

Hàm re.search trả về một đối tượng match khi thành công, none khi thất bại. Chúng ta sử dụng hàm group(num) hoặc groups() của đối tượng match để lấy biểu thức đã khớp.

Sr.No. Match Object Methods & Description
1 group(num=0) This method returns entire match (or specific subgroup num)
2 groups() This method returns all matching subgroups in a tuple (empty if there weren't any)

Example

import re
line = "Cats are smarter than dogs"
matchObj = re.search( r'than', line)
print (matchObj.start(), matchObj.end())
print ("matchObj.group() : ", matchObj.group())

Nó sẽ sản xuất output

17 21
matchObj.group() : than

Matching Vs Searching

Python cung cấp hai phép toán nguyên thủy khác nhau dựa trên biểu thức chính quy, match kiểm tra xem có khớp chỉ tại đầu chuỗi hay không, trong khi search kiểm tra xem có khớp ở bất kỳ đâu trong chuỗi (đây là cách mà Perl làm theo mặc định).

Example

import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print ("match --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print ("search --> searchObj.group() : ", searchObj.group())
else:
   print ("Nothing found!!")

Khi đoạn mã trên được thực thi, nó sẽ tạo ra output

No match!!
search --> matchObj.group() : dogs

The re.findall() Function

Hàm findall() trả về tất cả các kết quả khớp không chồng lấp của mẫu trong chuỗi, dưới dạng danh sách các chuỗi hoặc bộ. Chuỗi được quét từ trái sang phải, và các kết quả khớp được trả về theo thứ tự tìm thấy. Các kết quả khớp rỗng cũng được đưa vào kết quả.

Syntax

re.findall(pattern, string, flags=0)

Parameters

Sr.No. Parameter & Description
1 Pattern This is the regular expression to be matched.
2 String This is the string, which would be searched to match the pattern anywhere in the string.
3 Flags You can specify different flags using bitwise OR (|). These are modifiers, which are listed in the table below.

Example

import re
string="Simple is better than complex."
obj=re.findall(r"ple", string)
print (obj)

Nó sẽ sản xuất output

['ple', 'ple']

Đoạn mã sau đây lấy danh sách các từ trong một câu với sự trợ giúp của hàm findall().

import re
string="Simple is better than complex."
obj=re.findall(r"\w*", string)
print (obj)

Nó sẽ sản xuất output

['Simple', '', 'is', '', 'better', '', 'than', '', 'complex', '', '']

The re.sub() Function

Một trong những phương pháp re quan trọng nhất sử dụng biểu thức chính quy là sub .

Syntax

re.sub(pattern, repl, string, max=0)

Phương thức này thay thế tất cả các xuất hiện của mẫu RE pattern trong string bằng repl , thay thế tất cả các xuất hiện trừ khi max được cung cấp. Phương thức này trả về chuỗi đã được sửa đổi.

Example

import re
phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)

# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)

Nó sẽ sản xuất output

Phone Num : 2004-959-559
Phone Num : 2004959559

Example

Ví dụ dưới đây sử dụng hàm sub() để thay thế tất cả các lần xuất hiện của từ "is" bằng từ "was" −

import re
string="Simple is better than complex. Complex is better than complicated."
obj=re.sub(r'is', r'was',string)
print (obj)

Nó sẽ sản xuất output

Simple was better than complex. Complex was better than complicated.

The re.compile() Function

Hàm compile() biên dịch một mẫu biểu thức chính quy thành một đối tượng biểu thức chính quy, có thể được sử dụng để so khớp bằng cách sử dụng các phương thức match(), search() và các phương thức khác.

Syntax

re.compile(pattern, flags=0)

Flags

Sr.No. Modifier & Description
1 re.I Performs case-insensitive matching.
2 re.L Interprets words according to the current locale. This interpretation affects the alphabetic group (\w and \W), as well as word boundary behavior (\b and \B).
3 re. M Makes $ match the end of a line (not just the end of the string) and makes ^ match the start of any line (not just the start of the string).
4 re.S Makes a period (dot) match any character, including a newline.
5 re.U Interprets letters according to the Unicode character set. This flag affects the behavior of \w, \W, \b, \B.
6 re.X Permits "cuter" regular expression syntax. It ignores whitespace (except inside a set [] or when escaped by a backslash) and treats unescaped # as a comment marker.

Chuỗi −

prog = re.compile(pattern)
result = prog.match(string)

is equivalent to −

result = re.match(pattern, string)

Nhưng việc sử dụng re.compile() và lưu trữ đối tượng biểu thức chính quy kết quả để tái sử dụng là hiệu quả hơn khi biểu thức đó sẽ được sử dụng nhiều lần trong một chương trình duy nhất.

Example

import re
string="Simple is better than complex. Complex is better than complicated."
pattern=re.compile(r'is')
obj=pattern.match(string)
obj=pattern.search(string)
print (obj.start(), obj.end())

obj=pattern.findall(string)
print (obj)

obj=pattern.sub(r'was', string)
print (obj)

Nó sẽ tạo ra đầu ra sau đây −

7 9
['is', 'is']
Simple was better than complex. Complex was better than complicated.

The re.finditer() Function

Hàm này trả về một bộ lặp (iterator) cung cấp các đối tượng khớp (match objects) cho tất cả các kết quả khớp không chồng lấp với mẫu RE trong chuỗi.

Syntax

re.finditer(pattern, string, flags=0)

Example

import re
string="Simple is better than complex. Complex is better than complicated."
pattern=re.compile(r'is')
iterator = pattern.finditer(string)
print (iterator )

for match in iterator:
   print(match.span())

Nó sẽ sản xuất output

(7, 9)
(39, 41)

Use Cases of Python Regex

Finding all Adverbs

findall() khớp với tất cả các trường hợp của một mẫu, không chỉ trường hợp đầu tiên như search() làm. Ví dụ, nếu một nhà văn muốn tìm tất cả các trạng từ trong một đoạn văn nào đó, họ có thể sử dụng findall() theo cách sau −

import re
text = "He was carefully disguised but captured quickly by police."
obj = re.findall(r"\w+ly\b", text)
print (obj)

Nó sẽ sản xuất output

['carefully', 'quickly']

Finding words starting with vowels

import re
text = 'Errors should never pass silently. Unless explicitly silenced.'
obj=re.findall(r'\b[aeiouAEIOU]\w+', text)
print (obj)

Nó sẽ sản xuất output

['Errors', 'Unless', 'explicitly']

Regular Expression Modifiers: Option Flags

Các biểu thức chính quy có thể bao gồm một bộ điều chỉnh tùy chọn để kiểm soát các khía cạnh khác nhau của việc khớp. Các bộ điều chỉnh được chỉ định dưới dạng một cờ tùy chọn. Bạn có thể cung cấp nhiều bộ điều chỉnh bằng cách sử dụng phép OR độc quyền (|), như đã trình bày trước đó và có thể được biểu thị bằng một trong những điều này −

Sr.No. Modifier & Description
1 re.I Performs case-insensitive matching.
2 re.L Interprets words according to the current locale. This interpretation affects the alphabetic group (\w and \W), as well as word boundary behavior(\b and \B).
3 re.M Makes $ match the end of a line (not just the end of the string) and makes ^ match the start of any line (not just the start of the string).
4 re.S Makes a period (dot) match any character, including a newline.
5 re.U Interprets letters according to the Unicode character set. This flag affects the behavior of \w, \W, \b, \B.
6 re.X Permits "cuter" regular expression syntax. It ignores whitespace (except inside a set [] or when escaped by a backslash) and treats unescaped # as a comment marker.

Regular Expression Patterns

Ngoại trừ các ký tự điều khiển, (+ ? . * ^ $ ( ) [ ] { } | \) , tất cả các ký tự khác khớp với chính nó. Bạn có thể thoát một ký tự điều khiển bằng cách đặt một dấu gạch chéo ngược trước nó.

Bảng sau liệt kê cú pháp biểu thức chính quy có sẵn trong Python −

Sr.No. Pattern & Description
1 ^ Matches beginning of line.
2 $ Matches end of line.
3 . Matches any single character except newline. Using m option allows it to match newline as well.
4 [...] Matches any single character in brackets.
5 [^...] Matches any single character not in brackets
6 re* Matches 0 or more occurrences of preceding expression.
7 re+ Matches 1 or more occurrence of preceding expression.
8 re? Matches 0 or 1 occurrence of preceding expression.
9 re{ n} Matches exactly n number of occurrences of preceding expression.
10 re{ n,} Matches n or more occurrences of preceding expression.
11 re{ n, m} Matches at least n and at most m occurrences of preceding expression.
12 a| b Matches either a or b.
13 (re) Groups regular expressions and remembers matched text.
14 (?imx) Temporarily toggles on i, m, or x options within a regular expression. If in parentheses, only that area is affected.
15 (?-imx) Temporarily toggles off i, m, or x options within a regular expression. If in parentheses, only that area is affected.
16 (?: re) Groups regular expressions without remembering matched text.
17 (?imx: re) Temporarily toggles on i, m, or x options within parentheses.
18 (?-imx: re) Temporarily toggles off i, m, or x options within parentheses.
19 (?#...) Comment.
20 (?= re) Specifies position using a pattern. Doesn't have a range.
21 (?! re) Specifies position using pattern negation. Doesn't have a range.
22 (?> re) Matches independent pattern without backtracking.
23 \w Matches word characters.
24 \W Matches nonword characters.
25 \s Matches whitespace. Equivalent to [\t\n\r\f].
26 \S Matches nonwhitespace.
27 \d Matches digits. Equivalent to [0-9].
28 \D Matches nondigits.
29 \A Matches beginning of string.
30 \Z Matches end of string. If a newline exists, it matches just before newline.
31 \z Matches end of string.
32 \G Matches point where last match finished.
33 \b Matches word boundaries when outside brackets. Matches backspace (0x08) when inside brackets.
34 \B Matches nonword boundaries.
35 \n, \t, etc. Matches newlines, carriage returns, tabs, etc.
36 \1...\9 Matches nth grouped subexpression.
37 \10 Matches nth grouped subexpression if it matched already. Otherwise refers to the octal representation of a character code.

Regular Expression Examples

Literal characters

Sr.No. Example & Description
1 python Match "python".

Character classes

Sr.No. Example & Description
1 [Pp]ython Match "Python" or "python"
2 rub[ye] Match "ruby" or "rube"
3 [aeiou] Match any one lowercase vowel
4 [0-9] Match any digit; same as [0123456789]
5 [a-z] Match any lowercase ASCII letter
6 [A-Z] Match any uppercase ASCII letter
7 [a-zA-Z0-9] Match any of the above
8 [^aeiou] Match anything other than a lowercase vowel
9 [^0-9] Match anything other than a digit

Special Character Classes

Sr.No. Example & Description
1 . Match any character except newline
2 \d Match a digit: [0-9]
3 \D Match a nondigit: [^0-9]
4 \s Match a whitespace character: [ \t\r\n\f]
5 \S Match nonwhitespace: [^ \t\r\n\f]
6 \w Match a single word character: [A-Za-z0-9_]
7 \W Match a nonword character: [^A-Za-z0-9_]

Repetition Cases

Sr.No. Example & Description
1 ruby? Match "rub" or "ruby": the y is optional
2 ruby* Match "rub" plus 0 or more ys
3 ruby+ Match "rub" plus 1 or more ys
4 \d{3} Match exactly 3 digits
5 \d{3,} Match 3 or more digits
6 \d{3,5} Match 3, 4, or 5 digits

Nongreedy repetition

Điều này khớp với số lần lặp lại nhỏ nhất −

Sr.No. Example & Description
1 <.*> Greedy repetition: matches "<python>perl>"
2 <.*?> Nongreedy: matches "<python>" in "<python>perl>"

Grouping with Parentheses

Sr.No. Example & Description
1 \D\d+ No group: + repeats \d
2 (\D\d)+ Grouped: + repeats \D\d pair
3 ([Pp]ython(, )?)+ Match "Python", "Python, python, python", etc.

Backreferences

Điều này khớp với một nhóm đã được khớp trước đó một lần nữa −

Sr.No. Example & Description
1 ([Pp])ython&\1ails Match python&pails or Python&Pails
2 (['"])[^\1]*\1 Single or double-quoted string. \1 matches whatever the 1st group matched. \2 matches whatever the 2nd group matched, etc.

Alternatives

Sr.No. Example & Description
1 python|perl Match "python" or "perl"
2 rub(y|le)) Match "ruby" or "ruble"
3 Python(!+|\?) "Python" followed by one or more ! or one ?

Anchors

Điều này cần phải chỉ định vị trí khớp.

Sr.No. Example & Description
1 ^Python Match "Python" at the start of a string or internal line
2 Python$ Match "Python" at the end of a string or line
3 \APython Match "Python" at the start of a string
4 Python\Z Match "Python" at the end of a string
5 \bPython\b Match "Python" at a word boundary
6 \brub\B \B is nonword boundary: match "rub" in "rube" and "ruby" but not alone
7 Python(?=!) Match "Python", if followed by an exclamation point.
8 Python(?!!) Match "Python", if not followed by an exclamation point.

Special Syntax with Parentheses

Sr.No. Example & Description
1 R(?#comment) Matches "R". All the rest is a comment
2 R(?i)uby Case-insensitive while matching "uby"
3 R(?i:uby) Same as above
4 rub(?:y|le)) Group only without creating \1 backreference