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 : ", numHasil 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.
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 | |
Contoh | Penerangan |
---|
实例 | 描述 |
---|---|
python | 匹配 "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_]'。 |