Rate this post

Regular Expression (RegEx) là một chuỗi ký tự đặc biệt sử dụng mẫu tìm kiếm để tìm một chuỗi hoặc tập hợp các chuỗi. Nó có thể phát hiện sự hiện diện hay vắng mặt của một văn bản bằng cách khớp văn bản đó với một mẫu cụ thể và cũng có thể chia một mẫu thành một hoặc nhiều mẫu phụ. Python cung cấp một mô-đun re hỗ trợ việc sử dụng Regular Expression trong Python. Chức năng chính của nó là cung cấp một tìm kiếm, trong đó nó nhận một Regular Expression và một chuỗi. Ở đây, nó trả về trận đấu đầu tiên hoặc không có trận đấu nào khác.

Ví dụ:

import re

s = 'hello python'

match = re.search(r'portal', s)

print('Index bắt đầu:', match.start())
print('Index kết thúc:', match.end())

Đoạn mã trên cung cấp chỉ mục bắt đầu và chỉ mục kết thúc của cổng chuỗi.

Lưu ý: Ở đây ký tự r (r’portal’) là viết tắt của raw, không phải regex. Chuỗi thô hơi khác so với chuỗi thông thường, nó sẽ không hiểu ký tự \ là ký tự thoát. Điều này là do công cụ Regular Expression sử dụng ký tự \ cho mục đích thoát riêng của nó.

Trước khi bắt đầu với mô-đun regex Python, hãy xem cách viết regex thực sự bằng cách sử dụng các ký tự đặc biệt hoặc các chuỗi đặc biệt.

MetaCharacters

Để hiểu sự tương tự của RE, Meta Characters rất hữu ích, quan trọng và sẽ được sử dụng trong các chức năng của mô-đun re. Dưới đây là danh sách các siêu ký tự.

\Được sử dụng để loại bỏ ý nghĩa đặc biệt của ký tự theo sau nó
[]Đại diện cho một lớp ký tự
^Khớp với phần đầu
$Phù hợp với kết thúc
Khớp với bất kỳ ký tự nào ngoại trừ dòng mới
|Có nghĩa là HOẶC (Khớp với bất kỳ ký tự nào được phân tách bởi nó.
?Khớp không hoặc một lần xuất hiện
*Bất kỳ số lần xuất hiện nào (kể cả 0 lần xuất hiện)
+Một hoặc nhiều lần xuất hiện
{} Cho biết số lần xuất hiện của Regular Expression trước đó để khớp.
() Kèm theo một nhóm Regex

Hãy thảo luận chi tiết về từng siêu ký tự này

\ – Dấu gạch chéo ngược

Dấu gạch chéo ngược (\) đảm bảo rằng ký tự không được xử lý theo cách đặc biệt. Đây có thể được coi là một cách để thoát khỏi các siêu ký tự. Ví dụ: nếu bạn muốn tìm kiếm dấu chấm (.) trong chuỗi thì bạn sẽ thấy rằng dấu chấm (.) sẽ được coi là một ký tự đặc biệt giống như một trong các siêu ký tự (như minh họa trong bảng trên). Nên đối với trường hợp này, chúng ta sẽ sử dụng dấu gạch chéo ngược (\) ngay trước dấu chấm (.) để nó mất đi sự đặc biệt. Xem ví dụ dưới đây để hiểu rõ hơn.

Ví dụ:

import re

s = 'hello.python'

# không sử dụng \
match = re.search(r'.', s)
print(match)

# sử dụng \
match = re.search(r'\.', s)
print(match)

kết quả:

<re.Match object; span=(0, 1), match='h'>
<re.Match object; span=(5, 6), match='.'>
> 

[] – Dấu ngoặc vuông

Dấu ngoặc vuông ([]) đại diện cho một lớp ký tự bao gồm một tập hợp các ký tự mà chúng tôi muốn so khớp. Ví dụ: lớp ký tự [abc] sẽ khớp với bất kỳ a, b hoặc c nào.

Chúng tôi cũng có thể chỉ định một phạm vi ký tự bằng cách sử dụng – bên trong dấu ngoặc vuông. Ví dụ,

  • [0, 3] là mẫu như [0123]
  • [a-c] giống như [abc]

Chúng ta cũng có thể đảo ngược lớp ký tự bằng ký hiệu dấu mũ (^). Ví dụ,

  • [^0-3] có nghĩa là bất kỳ số nào ngoại trừ 0, 1, 2 hoặc 3
  • [^a-c] có nghĩa là bất kỳ ký tự nào ngoại trừ a, b hoặc c

^ – dấu mũ

Biểu tượng dấu mũ (^) khớp với phần đầu của chuỗi, tức là kiểm tra xem chuỗi có bắt đầu bằng (các) ký tự đã cho hay không. Ví dụ –

  • ^g sẽ kiểm tra xem chuỗi có bắt đầu bằng g chẳng hạn như Global, girl, g, v.v.
  • ^gre sẽ kiểm tra xem chuỗi có bắt đầu bằng ge chẳng hạn như greed, geets, v.v.

$ – Đô la

Biểu tượng Dollar($) khớp với phần cuối của chuỗi, tức là kiểm tra xem chuỗi có kết thúc bằng (các) ký tự đã cho hay không. Ví dụ –

  • s$ sẽ kiểm tra chuỗi kết thúc bằng a chẳng hạn như starts, ends, s, v.v.
  • ks$ sẽ kiểm tra chuỗi kết thúc bằng ks chẳng hạn như ks, kriks, v.v.

. – Chấm

Biểu tượng dấu chấm (.) chỉ khớp với một ký tự duy nhất ngoại trừ ký tự xuống dòng (\n). Ví dụ –

a.b sẽ kiểm tra chuỗi chứa bất kỳ ký tự nào ở vị trí của dấu chấm, chẳng hạn như acb, acbd, abbb, v.v.

.. sẽ kiểm tra chuỗi chứa ít nhất 2 ký tự

| – Hoặc

Ký hiệu or hoạt động như toán tử or nghĩa là nó kiểm tra xem mẫu trước hoặc sau ký hiệu or có trong chuỗi hay không. Ví dụ –

a|b sẽ khớp với bất kỳ chuỗi nào chứa a hoặc b chẳng hạn như acd, bcd, abcd, v.v.

? – Dấu chấm hỏi

Dấu chấm hỏi(?) kiểm tra xem chuỗi trước dấu chấm hỏi trong Regular Expression có xảy ra ít nhất một lần hay không. Ví dụ –

ab?c sẽ khớp với chuỗi ac, acb, dabc nhưng sẽ không khớp với abbc vì có hai b. Tương tự, nó sẽ không khớp với abdc vì b không theo sau c.

* – Ngôi sao

Ký hiệu dấu sao (*) khớp với 0 hoặc nhiều lần xuất hiện của Regular Expression trước ký hiệu *. Ví dụ –

ab*c sẽ khớp với chuỗi ac, abc, abbbc, dabc, v.v. nhưng sẽ không khớp với abdc vì b không được theo sau bởi c.

+ – Cộng

Biểu tượng dấu cộng (+) khớp với một hoặc nhiều lần xuất hiện của Regular Expression trước biểu tượng +. Ví dụ –

ab+c sẽ khớp với chuỗi abc, abbc, dabc, nhưng sẽ không khớp với ac, abdc vì không có b trong ac và b không theo sau c trong abdc.

{m, n} – ngoặc nhọn

Niềng răng khớp với bất kỳ sự lặp lại nào trước Regular Expression từ m đến n bao gồm cả hai. Ví dụ –

a{2, 4} sẽ khớp với chuỗi aaab, baaaac, gaad, nhưng sẽ không khớp với các chuỗi như abc, bc vì chỉ có một a hoặc không có a trong cả hai trường hợp.

(<regex>) – Nhóm

Biểu tượng nhóm được sử dụng để nhóm các mẫu phụ. Ví dụ –

(a|b)cd sẽ khớp với các chuỗi như acd, abcd, gacd, v.v.

Chuỗi ký tự đặc biệt

Các chuỗi đặc biệt không khớp với ký tự thực tế trong chuỗi thay vào đó, nó cho biết vị trí cụ thể trong chuỗi tìm kiếm nơi phải xảy ra khớp. Nó làm cho nó dễ dàng hơn để viết các mẫu thường được sử dụng.

Danh sách các chuỗi đặc biệt

  • \A Khớp nếu chuỗi bắt đầu bằng ký tự đã cho
  • \b Khớp nếu từ bắt đầu hoặc kết thúc bằng ký tự đã cho. \b(string) sẽ kiểm tra phần đầu của từ và (string)\b sẽ kiểm tra phần cuối của từ. 
  • \B Nó ngược lại với \b, tức là chuỗi không được bắt đầu hoặc kết thúc bằng Regular Expression đã cho. 
  • \d Khớp với bất kỳ chữ số thập phân nào, điều này tương đương với lớp đã đặt [0-9] \d 123
  • \D Khớp với bất kỳ ký tự không phải chữ số nào, điều này tương đương với lớp đã đặt [^0-9] 
  • \s So khớp với bất kỳ ký tự khoảng trắng nào. 
  • \S So khớp với mọi ký tự không phải khoảng trắng 
  • \w Khớp với bất kỳ ký tự chữ và số nào, điều này tương đương với lớp [a-zA-Z0-9_].
  • \W Khớp với bất kỳ ký tự không phải chữ và số nào.
  • \Z Khớp nếu chuỗi kết thúc bằng Regular Expression đã cho

Mô-đun Regex trong Python

Python có một mô-đun tên là re được sử dụng cho các Regular Expression trong Python. Chúng ta có thể nhập mô-đun này bằng cách sử dụng câu lệnh nhập.

Ví dụ: Nhập lại mô-đun trong Python

Hãy xem các hàm khác nhau do mô-đun này cung cấp để hoạt động với Regular Expression trong Python.

re.findall()

Trả về tất cả các kết quả khớp mẫu không chồng chéo trong chuỗi, dưới dạng danh sách các chuỗi. Chuỗi được quét từ trái sang phải và kết quả khớp được trả về theo thứ tự tìm thấy.

Ví dụ: Tìm tất cả các lần xuất hiện của một mẫu

#import thư viện re
import re

#string dùng để search
string = """Hello my Number is 123456789 and
			my friend's number is 987654321"""

# đoạn regex tìm số
regex = '\d+'

match = re.findall(regex, string)
print(match)

re.compile()

Các Regular Expression được biên dịch thành các đối tượng mẫu, có các phương thức cho các hoạt động khác nhau, chẳng hạn như tìm kiếm các kết quả khớp mẫu hoặc thực hiện thay thế chuỗi.

Ví dụ 1:

#import thư viện
import re
#compiler một đoạn từ a đến e
p = re.compile('[a-e]')
#tìm tất cả giá trị chữ từ a đến e
print(p.findall("Aye, said Mr. Gibenson Stark"))

Giải thích:

Lần xuất hiện đầu tiên là ‘e’ trong “Aye” chứ không phải ‘A’, vì nó phân biệt chữ hoa chữ thường.

Lần xuất hiện tiếp theo là ‘a’ trong “said”, sau đó là ‘d’ trong “said”, tiếp theo là ‘b’ và ‘e’ trong “Gibenson”, ‘a’ cuối khớp với “Stark”.

Dấu gạch chéo ngược siêu ký tự ‘\’ có vai trò rất quan trọng vì nó báo hiệu các chuỗi khác nhau. Nếu dấu gạch chéo ngược được sử dụng mà không có ý nghĩa đặc biệt như siêu ký tự, hãy sử dụng’\\’

Ví dụ 2:

Đặt lớp [\s,.] sẽ khớp với bất kỳ ký tự khoảng trắng nào, ‘,’ hoặc, ‘.’ .

import re

# \d tương đương với [0-9].
p = re.compile('\d')
print(p.findall("I go with him at 11 A.M. on 4th July 1886"))

# \d+ sẽ khớp với một nhóm trên [0-9], nhóm
# của một hoặc kích thước lớn hơn
p = re.compile('\d+')
print(p.findall("I go to with him at 11 A.M. on 4th July 1886"))

Ví dụ 3:

import re

# \w tương đương với [a-zA-Z0-9_].
p = re.compile('\w')
print(p.findall("He said * in some_lang."))

# \w+ khớp với nhóm ký tự chữ và số.
p = re.compile('\w+')
print(p.findall("I went to him at 11 A.M., he \
said *** in some_language."))

# \W khớp với các ký tự không phải chữ và số.
p = re.compile('\W')
print(p.findall("he said *** in some_language."))

Ví dụ 4:

import re

# '*' thay thế cho số không hoặc xảy ra
# của một ký tự.
p = re.compile('ab*')
print(p.findall("ababbaabbb"))

Giải thích:

  • RE của chúng tôi là ab*, mà ‘a’ acc
  • ompanied bởi bất kỳ không. của ‘b’s, bắt đầu từ 0.
  • Đầu ra ‘ab’, hợp lệ vì một chữ ‘a’ đi kèm với một chữ ‘b’.
  • Đầu ra ‘abb’, hợp lệ vì một chữ ‘a’ đi kèm với 2 chữ ‘b’.
  • Đầu ra ‘a’, hợp lệ vì một chữ ‘a’ đi kèm với 0 ‘b’.
  • Đầu ra ‘abbb’, hợp lệ vì một chữ ‘a’ đi kèm với 3 chữ ‘b’.

re.split() 

Tách chuỗi theo số lần xuất hiện của một ký tự hoặc một mẫu, khi tìm thấy mẫu đó, các ký tự còn lại trong chuỗi được trả về như một phần của danh sách kết quả.

Cú pháp:

re.split(pattern, string, maxsplit=0, flags=0)

Tham số đầu tiên, mẫu biểu thị Regular Expression, String là chuỗi đã cho trong đó mẫu sẽ được tìm kiếm và trong đó xảy ra quá trình phân tách, maxsplit nếu không được cung cấp sẽ được coi là 0 ‘0’ và nếu có bất kỳ giá trị khác 0 nào được cung cấp, thì nhiều nhất là nhiều chia tách xảy ra. Nếu maxsplit = 1, thì chuỗi sẽ chỉ tách một lần, dẫn đến danh sách có độ dài 2. Các Flags rất hữu ích và có thể giúp rút ngắn mã, chúng không phải là tham số cần thiết, ví dụ: flags = re.IGNORECASE, trong phần tách này , trường hợp, tức là chữ thường hoặc chữ hoa sẽ bị bỏ qua.

Ví dụ 1:

from re import split

# '\W+' biểu thị các ký tự không phải chữ và số
# hoặc nhóm ký tự Khi tìm thấy ','
# hoặc khoảng trắng ' ', phép tách(), phép chia
# chuỗi từ thời điểm đó
print(split('\W+', 'Words, words , Words'))
print(split('\W+', "Word's words Words"))

# Ở đây ':', ' ' ,',' không phải là AlphaNumeric do đó,
# điểm xảy ra sự phân tách
print(split('\W+', 'On 12th Jan 2016, at 11:02 AM'))

# '\d+' biểu thị Ký tự số hoặc nhóm ký tự
# ký tự Việc tách xảy ra tại '12', '2016',
# '11', '02'
print(split('\d+', 'On 12th Jan 2016, at 11:02 AM'))

Ví dụ 2:

import re

# Việc chia tách sẽ chỉ xảy ra một lần, tại
# '12', danh sách trả về sẽ có độ dài 2
print(re.split('\d+', 'On 12th Jan 2016, at 11:02 AM', 1))

# 'Boy' và 'boy' sẽ được đối xử như nhau khi
# flags = re.IGNORECASE
print(re.split('[a-f]+', 'Aey, Boy oh boy, come here', flags=re.IGNORECASE))
print(re.split('[a-f]+', 'Aey, Boy oh boy, come here'))

re.sub()

‘Sub’ trong hàm là viết tắt của SubString, một mẫu Regular Expression nhất định được tìm kiếm trong chuỗi đã cho (tham số thứ 3) và khi tìm thấy mẫu chuỗi con được thay thế bằng thay thế (tham số thứ 2), kiểm tra đếm và duy trì số lần điều này xảy ra.

Cú pháp:

 re.sub(pattern, repl, string, count=0, flags=0)

Ví dụ 1:

import re

# Mẫu biểu thức chính quy 'ub' khớp với
# chuỗi tại "Subject" và "Uber". Như trường hợp
# đã bị bỏ qua, sử dụng Flags, 'ub' sẽ
# khớp hai lần với chuỗi Khi khớp,
# 'ub' được thay thế bằng '~*' trong "Subject" và
# trong "Uber", 'Ub' được thay thế.
print(re.sub('ub', '~*', 'Subject has Uber booked already',
			flags=re.IGNORECASE))

# Cân nhắc phân biệt chữ hoa chữ thường, 'Ub' trong
# "Uber", sẽ không bị thay thế.
print(re.sub('ub', '~*', 'Subject has Uber booked already'))

# Khi số lượng đã được đưa ra giá trị 1, giá trị tối đa
# lần thay thế xảy ra là 1
print(re.sub('ub', '~*', 'Subject has Uber booked already',
			count=1, flags=re.IGNORECASE))

# 'r' trước mẫu biểu thị RE, \s dành cho
# bắt đầu và kết thúc một Chuỗi.
print(re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam',
			flags=re.IGNORECASE))

re.subn()

subn() tương tự như sub() về mọi mặt, ngoại trừ cách cung cấp đầu ra. Nó trả về một bộ với tổng số thay thế và chuỗi mới thay vì chỉ chuỗi.

Cú pháp:

re.subn(pattern, repl, string, count=0, flags=0)

Ví dụ:

import re

print(re.subn('ub', '~*', 'Subject has Uber booked already'))

t = re.subn('ub', '~*', 'Subject has Uber booked already',
			flags=re.IGNORECASE)
print(t)
print(len(t))

# Điều này sẽ cho kết quả giống như sub() sẽ có
print(t[0])

re.escape()

Trả về chuỗi với tất cả các ký tự không phải chữ và số được gạch chéo ngược, điều này hữu ích nếu bạn muốn khớp một chuỗi ký tự tùy ý có thể chứa các ký tự siêu Regular Expression trong đó.

Cú pháp:

re.escape(string)

Ví dụ:

import re

# escape() trả về một chuỗi có BackSlash '\',
# trước mỗi ký tự không phải chữ và số
# Trong trường hợp đầu tiên chỉ có ' ', không phải là chữ và số
# Trong trường hợp thứ 2, ' ', dấu mũ '^', '-', '[]', '\'
# không phải là chữ và số
print(re.escape("This is Awesome even 1 AM"))
print(re.escape("I Asked what is this [a-9], he said \t ^WoW"))

Phương thức này trả về Không (nếu mẫu không khớp) hoặc re.MatchObject chứa thông tin về phần khớp của chuỗi. Phương pháp này dừng sau lần khớp đầu tiên, vì vậy phương pháp này phù hợp nhất để kiểm tra Regular Expression hơn là trích xuất dữ liệu.

Ví dụ: Tìm kiếm sự xuất hiện của mẫu

import re

# Cho phép sử dụng biểu thức chính quy để khớp chuỗi ngày
# ở dạng tên tháng theo sau là số ngày
regex = r"([a-zA-Z]+) (\d+)"

match = re.search(regex, "I was born on June 24")

if match != None:

	# Chúng ta đến đây khi biểu thức "([a-zA-Z]+) (\d+)"
# khớp với chuỗi ngày.

# Điều này sẽ in [14, 21), vì nó khớp với chỉ số 14
# và kết thúc ở 21.
	print ("Match at index %s, %s" % (match.start(), match.end()))
# Chúng ta sử dụng phương thức group() để lấy tất cả các kết quả khớp và
# nhóm bị bắt. Các nhóm chứa các giá trị phù hợp.
# Đặc biệt:
# match.group(0) luôn trả về chuỗi khớp hoàn toàn
# match.group(1) match.group(2), ... trả về ảnh chụp
# nhóm theo thứ tự từ trái sang phải trong chuỗi nhập
# match.group() tương đương với match.group(0)

# Vì vậy, điều này sẽ in "ngày 24 tháng 6"
	print ("Full match: %s" % (match.group(0)))
	print ("Month: %s" % (match.group(1)))
	print ("Day: %s" % (match.group(2)))

else:
	print ("The regex pattern does not match.")

Tìm Object phù hợp

Một đối tượng Match chứa tất cả thông tin về tìm kiếm và kết quả và nếu không tìm thấy kết quả phù hợp thì Không có sẽ được trả về. Hãy xem một số phương thức và thuộc tính thường được sử dụng của đối tượng khớp.

  1. Lấy chuỗi và regex

thuộc tính match.re trả về Regular Expression được truyền và thuộc tính match.string trả về chuỗi được truyền.

Ví dụ: Lấy chuỗi và Regular Expression của đối tượng phù hợp

import re

s = "Welcome to python"

#tìm object phù hơp
res = re.search(r"\bp", s)

print(res.re)
print(res.string)

  1. Lấy index của đối tượng phù hợp
  • phương thức start() trả về chỉ mục bắt đầu của chuỗi con phù hợp
  • phương thức end() trả về chỉ mục kết thúc của chuỗi con phù hợp
  • span() trả về một tuple chứa chỉ số bắt đầu và chỉ số kết thúc của chuỗi con phù hợp

Ví dụ: Lấy chỉ số của đối tượng phù hợp

import re

s = "Welcome to python"

# x là object phù hợp
res = re.search(r"\bpyt", s)

print(res.start())
print(res.end())
print(res.span())

Tìm chuỗi con phù hợp

group() trả về một phần của chuỗi phù hợp với các mẫu. Xem ví dụ dưới đây để hiểu rõ hơn.

Ví dụ: Nhận chuỗi con phù hợp

import re

s = "Welcome to python"

# với x là object phù hợp
res = re.search(r"\D{2} t", s)
print(res.group())

Trong ví dụ trên, mẫu của chúng tôi chỉ định cho chuỗi chứa ít nhất 2 ký tự, theo sau là khoảng trắng và theo sau khoảng trắng là t.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now