书籍正则
Posted yfjly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了书籍正则相关的知识,希望对你有一定的参考价值。
1 正则表达式,简称为regex,是文本模式的描述方法。例如,d 是一个正则表达式,表示一位数字字符,即任何一位 0 到 9 的数字
虽然在Python中使用正则表达式有几个步骤,但每一步都相当简单。
1.用import re导入正则表达式模块。
2.用re.compile()函数创建一个Regex对象(记得使用原始字符串)
*意味着“匹配零次或多次”,+(加号)则意味着“匹配一次或多次”。星号不要求分组出现在匹配的字符串中,但加号不同,加号前面的分组
4.调用Match对象的group()方法,返回实际匹配文本的字符串
代码举例
import re message = ‘my phone number is 415-555-1011 .‘ phone_search = re.compile(‘d{3}-d{3}-d{4}‘) mo = phone_search.search(message) print(mo.group())
字符|称为“管道”。希望匹配许多表达式中的一个时,就可以使用它。例如,正则表达式r‘Batman|Tina Fey‘将匹配‘Batman‘或‘Tina Fey‘。
heroRegex = re.compile(r‘fin|tian|an|and‘) message2 = ‘I can be fin and tian an men‘ mo2 = heroRegex.search(message2) print(mo2.group())
你可以认为?是在说,“匹配这个问号之前的分组零次或一次”。
如果需要匹配真正的问号字符,就使用转义字符?。
>>> phoneRegex = re.compile(r‘(ddd-)?ddd-dddd‘)
>>> mo1 = phoneRegex.search(‘My number is 415-555-4242‘)
>>> mo1.group()
‘415-555-4242‘
>>> mo2 = phoneRegex.search(‘My number is 555-4242‘)
>>> mo2.group()
‘555-4242‘
4 用星号匹配零次或多次
*(称为星号)意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次地重复。让我们再来看看Batman的例子。
>>> batRegex = re.compile(r‘Bat(wo)*man‘)
>>> mo1 = batRegex.search(‘The Adventures of Batman‘)
>>> mo1.group()
‘Batman‘
>>> mo2 = batRegex.search(‘The Adventures of Batwoman‘)
>>> mo2.group()
‘Batwoman‘
>>> mo3 = batRegex.search(‘The Adventures of Batwowowowoman‘)
>>> mo3.group()
‘Batwowowowoman‘
对于‘Batman‘,正则表达式的(wo)部分匹配wo的零个实例。对于‘Batwoman‘,(wo)匹配wo的一个实例。对于‘Batwowowowoman‘,(wo)*匹配wo的4个实例。
如果需要匹配真正的星号字符,就在正则表达式的星号字符前加上倒斜杠,即*。
*意味着“匹配零次或多次”,+(加号)则意味着“匹配一次或多次”。星号不要求分组出现在匹配的字符串中,但加号不同,加号前面的分组必须“至少出现一次”。
7.3.6 用花括号匹配特定次数
如果想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括号包围的数字。例如,正则表达式(Ha){3}将匹配字符串‘HaHaHa‘,但不会匹配‘HaHa‘,因为后者只重复了(Ha)分组两次。
除了一个数字,还可以指定一个范围,即在花括号中写下一个最小值、一个逗号和一个最大值。例如,正则表达式(Ha){3,5}将匹配‘HaHaHa‘、‘HaHaHaHa‘和‘HaHaHaHaHa‘。
也可以不写花括号中的第一个或第二个数字,不限定最小值或最大值。例如,(Ha){3,}将匹配3次或更多次实例,(Ha){,5}将匹配0到5次实例。花括号让正则表达式更简短
Python的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的“非贪心”版本匹配尽可能最短的字符串,即在结束的花括号后跟着一个问号
>>> greedyHaRegex = re.compile(r‘(Ha){3,5}‘)
>>> mo1 = greedyHaRegex.search(‘HaHaHaHaHa‘)
>>> mo1.group()
‘HaHaHaHaHa‘
>>> nongreedyHaRegex = re.compile(r‘(Ha){3,5}?‘)
>>> mo2 = nongreedyHaRegex.search(‘HaHaHaHaHa‘)
>>> mo2.group()
‘HaHaHa‘
1.如果调用在一个没有分组的正则表达式上,例如ddd-ddd-dddd,方法findall()将返回一个匹配字符串的列表,例如[‘415-555-9999‘, ‘212-555-0000‘]。
2.如果调用在一个有分组的正则表达式上,例如(ddd)-(ddd)-(dddd),方法findall()将返回一个字符串的元组的列表(每个分组对应一个字符串),例如[(‘415‘, ‘555‘, ‘1122‘), (‘212‘, ‘555‘, ‘0000‘)]
d 0到9的任何数字
D 除0到9的数字以外的任何字符
w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
W 除字母、数字和下划线以外的任何字符
s 空格、制表符或换行符(可以认为是匹配“空白”字符)
S 除空格、制表符和换行符以外的任何字符
有时候你想匹配一组字符,但缩写的字符分类太宽泛。你可以用方括号定义自己的字符分类。例如,字符分类[aeiouAEIOU]将匹配所有元音字符,不论大小写也可以使用短横表示字母或数字的范围。例如,字符分类[a-zA-Z0-9]将匹配所有小写字母、大写字母和数字。
请注意,在方括号内,普通的正则表达式符号不会被解释。这意味着,你不需要前面加上倒斜杠转义.、*、?或()字符zi
通过在字符分类的左方括号后加上一个插入字符(^),就可以得到“非字符类”。非字符类将匹配不在这个字符类中的所有字符
以上是关于书籍正则的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性