Ungkapan biasa Python


Ungkapan biasa ialah jujukan aksara khas yang boleh membantu anda menyemak dengan mudah sama ada rentetan sepadan dengan corak tertentu.

Python telah menambah modul semula sejak versi 1.5, yang menyediakan corak ungkapan biasa gaya Perl. Modul

semula membawa keupayaan ekspresi biasa penuh kepada bahasa Python. Fungsi

kompil menjana objek ungkapan biasa berdasarkan rentetan corak dan argumen bendera pilihan. Objek ini mempunyai satu siri kaedah untuk pemadanan dan penggantian ungkapan biasa. Modul

re juga menyediakan fungsi yang sama dengan kaedah ini, yang mengambil rentetan corak sebagai hujah pertama mereka.

Bab ini terutamanya memperkenalkan fungsi pemprosesan ungkapan biasa yang biasa digunakan dalam Python.


fungsi re.match

re.match cuba memadankan corak dari kedudukan permulaan rentetan Jika padanan tidak berjaya dari posisi permulaan, match() kembali tiada.

Sintaks fungsi:

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

Penerangan parameter fungsi:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

Kaedah re.match mengembalikan objek yang sepadan jika perlawanan berjaya, jika tidak ia mengembalikan Tiada .

Kita boleh menggunakan fungsi objek padanan kumpulan(num) atau kumpulan() untuk mendapatkan ungkapan yang sepadan.

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

Instance 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.match('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.match('com', 'www.php.cn'))         # 不在起始位置匹配

Output contoh di atas ialah:

(0, 3)
None

Instance 2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

Hasil pelaksanaan di atas instance adalah seperti berikut:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

kaedah carian semula

re.search mengimbas keseluruhan rentetan dan mengembalikan perlawanan pertama yang berjaya.

Sintaks fungsi:

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

Penerangan parameter fungsi:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

Kaedah carian semula mengembalikan objek yang sepadan jika perlawanan berjaya, jika tidak, ia tidak mengembalikan Tiada.

Kita boleh menggunakan fungsi objek padanan kumpulan(num) atau kumpulan() untuk mendapatkan ungkapan yang sepadan.

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

Instance 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.search('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.search('com', 'www.php.cn').span())         # 不在起始位置匹配

Output contoh di atas ialah:

(0, 3)
(11, 14)

Instance 2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"
Hasil pelaksanaan contoh di atas adalah seperti berikut :
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

Perbezaan antara re.match dan re.search

re.match hanya sepadan dengan permulaan rentetan Jika permulaan rentetan tidak sepadan dengan ungkapan biasa, padanan gagal dan fungsi mengembalikan Tiada semasa re.search Memadankan keseluruhan rentetan sehingga padanan ditemui.

Contoh:

#!/usr/bin/python
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!!"

matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print "search --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
Keputusan contoh di atas adalah seperti berikut:
No match!!
search --> matchObj.group() :  dogs

Pendapatan dan penggantian

Modul semula Python menyediakan re.sub untuk menggantikan rentetan .

Sintaks:

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

Rentetan yang dikembalikan digantikan dengan padanan RE tidak berulang paling kiri dalam rentetan. Jika corak tidak ditemui, aksara akan dikembalikan tidak berubah.

Kiraan parameter pilihan ialah bilangan maksimum penggantian selepas padanan corak mestilah integer bukan negatif. Nilai lalai ialah 0 yang menggantikan semua padanan.

Contoh:

#!/usr/bin/python
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
Hasil pelaksanaan contoh di atas adalah seperti berikut:
Phone Num :  2004-959-559
Phone Num :  2004959559

Pengubah suai ungkapan biasa - bendera pilihan

Ungkapan biasa boleh mengandungi beberapa pengubahsuaian bendera pilihan watak untuk mengawal corak padanan. Pengubah suai ditentukan sebagai bendera pilihan. Bendera berbilang boleh ditentukan dengan bitwise ATAU(|) mereka. Contohnya, re.I |. re.M ditetapkan kepada bendera I dan M:

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 w, W, b, B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

Corak ungkapan biasa

Rentetan corak menggunakan sintaks khas untuk mewakili ungkapan biasa:

Huruf dan nombor mewakili diri mereka sendiri. Huruf dan nombor dalam corak ungkapan biasa sepadan dengan rentetan yang sama.

Kebanyakan huruf dan nombor mempunyai makna yang berbeza apabila didahului dengan garis serong ke belakang.

Tanda baca sepadan dengan dirinya hanya jika ia dilepaskan, jika tidak, ia mewakili makna yang istimewa.

Serikan terbalik itu sendiri perlu dilepaskan dengan sengkang terbalik.

Memandangkan ungkapan biasa biasanya mengandungi garis miring ke belakang, lebih baik anda menggunakan rentetan mentah untuk mewakilinya. Elemen corak (seperti r'/t', bersamaan dengan '//t') sepadan dengan aksara khas yang sepadan.

Jadual berikut menyenaraikan elemen khas dalam sintaks corak ungkapan biasa. Jika anda menggunakan corak dan memberikan hujah bendera pilihan, maksud beberapa elemen corak akan berubah.

Ke hadapan pembatas positif. Berjaya jika ungkapan biasa yang terkandung, dilambangkan dengan ... , berjaya sepadan dengan kedudukan semasa, jika tidak, ia gagal. Tetapi setelah ungkapan yang terkandung telah dicuba, enjin padanan tidak bertambah baik sama sekali; baki corak masih perlu mencuba bahagian kanan pembatas. Pembatas negatif ke hadapan. Bertentangan dengan pembatas positif; berjaya apabila ungkapan yang terkandung tidak boleh dipadankan pada kedudukan semasa dalam rentetan Corak bebas dipadankan, diabaikan Pergi ke belakang. padan dengan aksara abjad angka dan garis bawahpadan dengan aksara bukan abjad dan garis bawah sepadan dengan mana-mana aksara ruang putih, bersamaan dengan [tnrf]. padanan Mana-mana aksara bukan kosong sepadan dengan mana-mana nombor, bersamaan dengan [0-9].padanan dengan mana-mana bukan nomborpadanan dengan permulaan rentetan Padan dengan hujung rentetan Jika terdapat baris baharu, hanya hujung rentetan sebelum baris baharu dipadankan. c sepadan dengan hujung rentetan sepadan dengan kedudukan di mana perlawanan terakhir selesai. sepadan dengan sempadan perkataan, yang merujuk kepada kedudukan antara perkataan dan ruang. Sebagai contoh, 'erb' sepadan dengan 'er' dalam "tidak pernah" tetapi bukan 'er' dalam "kata kerja". sepadan dengan sempadan bukan perkataan. 'erB' sepadan dengan 'er' dalam "kata kerja" tetapi bukan dalam "tidak pernah". sepadan dengan watak baris baharu. Padan dengan watak tab. dsb. sepadan dengan subungkapan kumpulan ke-n. Memadankan subungkapan kumpulan ke-n jika dipadankan. Jika tidak, ia merujuk kepada ungkapan kod aksara oktal. Contoh ungkapan biasa
Corak Penerangan
^ Padan dengan permulaan rentetan
$ sepadan dengan hujung rentetan.
. sepadan dengan mana-mana aksara kecuali aksara baris baharu Apabila bendera re.DOTALL ditentukan, ia boleh memadankan mana-mana aksara termasuk aksara baris baharu.
[...] digunakan untuk mewakili sekumpulan aksara, disenaraikan secara berasingan: [amk] sepadan dengan 'a', 'm' atau 'k'
[^...]Watak tiada dalam []: [^abc] sepadan dengan aksara selain daripada a, b, c.
semula* sepadan dengan 0 atau lebih ungkapan.
re+ sepadan dengan satu atau lebih ungkapan.
semula? Memadankan 0 atau 1 serpihan yang ditakrifkan oleh ungkapan biasa sebelumnya, cara tidak tamak
semula{ n}
re{ n,}Padanan tepat dengan n ungkapan sebelumnya.
re{ n, m} Padankan n hingga m darab serpihan yang ditakrifkan oleh ungkapan biasa sebelumnya, cara tamak
a|. b sepadan dengan a atau b
(re)G sepadan dengan ungkapan dalam kurungan dan juga mewakili kumpulan
(?imx)Ungkapan biasa mengandungi tiga bendera pilihan: i, m atau x. Hanya menjejaskan kawasan dalam kurungan.
(?-imx)Ungkapan biasa untuk mematikan bendera pilihan i, m atau x. Hanya menjejaskan kawasan dalam kurungan.
(?: re) serupa dengan (...), tetapi tidak mewakili kumpulan
(?imx : re) dalam kurungan menggunakan i, m atau x bendera pilihan
(?-imx: re) dalam kurungan Jangan gunakan bendera pilihan i, m atau x
(?#...) ulasan (?= semula)
(?! re)
(?> re)
w
W
s
S
d
D
A
Z
z
G
b
B
n, t, dsb.
1...9
10
Padanan aksara

python

ContohPenerangan
实例描述
python匹配 "python".
padan dengan "python".<🎜> < 🎜><🎜><🎜>

Kelas watak

实例描述
[Pp]ython匹配 "Python" 或 "python"
rub[ye]匹配 "ruby" 或 "rube"
[aeiou]匹配中括号内的任意一个字母
[0-9]匹配任何数字。类似于 [0123456789]
[a-z]匹配任何小写字母
[A-Z]匹配任何大写字母
[a-zA-Z0-9]匹配任何字母及数字
[^aeiou]除了aeiou字母以外的所有字符
[^0-9]匹配除了数字外的字符

Kelas watak istimewa

实例描述
.匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.n]' 的模式。
d匹配一个数字字符。等价于 [0-9]。
D匹配一个非数字字符。等价于 [^0-9]。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。
S匹配任何非空白字符。等价于 [^ fnrtv]。
w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。