【Python读书笔记】正则表达式 2018-06-06

本文是关于Python正则表达式的读书笔记,探讨了为何在正则表达式中使用1能匹配到内容,讲解了分组的概念,以及字符分类如d、w等的含义。还介绍了如何自定义字符分类,并通过实例解析了正则表达式的插入字符、美元符号、通配符.、不区分大小写匹配、sub()方法替换字符串等功能。此外,文章提到了使用re.VERBOSE进行复杂正则表达式的管理,并展示了如何组合使用多个标志位。

\1 典型问题:

python 下面的正则表达式为什么加上\1就能匹配到 不加就匹配不到 

p = re.compile(r'\b\w+\s+') 或者写成 p = re.compile(r'(\b\w+)\s+')
print p.search('Paris in the the spring spring ').group()
输出结果为 'Paris'
而变为 p = re.compile(r'(\b\w+)\s+\1')就能匹配到成对出现的单词 the the, 可是 却匹配不到 spring spring;
问题: 到底这个\1是做什么用的, 加上括号又起什么作用呢

我的解答:

!!!\1、\2、\3......分别表示此前分组1、2、3......所匹配的文本,而不是分组本身

 p =re.compile(r'(\b\w+)\s+\1') 


1.正则表达式模式r'\b\w+\s+\1' == r"\b\w+\s+'模式\b\w+所匹配的文本'"   

2.r'\b\w+\s+\1' != r'\b\w+\s+\b\w'

3.因此这个模式可以看做是2个相同的单词中间有一个活多个空格,所以print(p.search('Paris in the the spring spring ').group())打印出来的有the the

4.至于为什么是 the the, 而不是 spring spring 这应该同\b和search()方法的用法相关,search()方法只取第一个匹配项,至于\b的用法还要研究一下

【1】字符分类

表7-1 常用字符分类的缩写代码
缩写字符分类                  表示
\d                                  0到9 的任何数字
\D                                 除0 到9 的数字以外的任何字符
\w                                 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
\W                                除字母、数字和下划线以外的任何字符
\s                                  空格、制表符或换行符(可以认为是匹配“空白”字符)
\S                                 除空格、制表符和换行符以外的任何字符


 ?匹配零次或一次前面的分组。

 *匹配零次或多次前面的分组。
 +匹配一次或多次前面的分组。
 {n}匹配n 次前面的分组。
 {n,}匹配n 次或更多前面的分组。
 {,m}匹配零次到m 次前面的分组。
 {n,m}匹配至少n 次、至多m 次前面的分组。
 {n,m}?或*?或+?对前面的分组进行非贪心匹配。
 ^spam 意味着字符串必须以spam 开始。
 spam$意味着字符串必须以spam 结束。
 .匹配所有字符,换行符除外。
 \d、\w 和\s 分别匹配数字、单词和空格。
 \D、\W 和\S 分别匹配出数字、单词和空格外的所有字符。
 [abc]匹配方括号内的任意字符(诸如a、b 或c)。

 [^abc]匹配不在方括号内的任意字符



【2】建立自己的字符分类

有时候你想匹配一组字符,但缩写的字符分类(\d、\w、\s 等)太宽泛。你可

以用方括号定义自己的字符分类。

例如,字符分类[aeiouAEIOU]将匹配所有元音字符,不论大小写。


通过在字符分类的左方括号后加上一个插入字符(^),就可以得到“非字符类”。

非字符类将匹配不在这个字符类中的所有字符。


PS:在方括号内,普通的正则表达式符号不会被解释。这意味着,你不需

要前面加上倒斜杠转义.、*、?或()字符。

例如,字符分类将匹配数字0 到5 和一个句点。你不需要将它写成[0-5\.]。

WHY?

典型问题:

如何写一个正则表达式,匹配姓Nakamoto 的完整姓名?你可以假定名字

总是出现在姓前面,是一个大写字母开头的单词。该正则表达式必须匹配:
 'Satoshi Nakamoto'
 'Alice Nakamoto'
 'RoboCop Nakamoto'
但不匹配:
 'satoshi Nakamoto'(名字没有大写首字母)
 'Mr. Nakamoto'(前面的单词包含非字母字符)
 'Nakamoto' (没有名字)
 'Satoshi nakamoto'(姓没有首字母大写)


为什么返回的是Cop Nakamoto,而不是RoboCop Nakamoto?

【3】插入字符和美元字符

    可以在正则表达式的开始处使用插入符号(^),表明匹配必须发生在被查找文
本开始处。类似地,可以再正则表达式的末尾加上美元符号($),表示该字符串必
须以这个正则表达式的模式结束。可以同时使用^和$,表明整个字符串必须匹配该
模式

对这个概念还不是很熟练,有待加强

【4】通配字符 .  

4.1通过将re.DOTALL传递给re.compile()函数的第二个参数,可以使句点符号表示包含\n在内的所有字符


4.2用.*点-星匹配所有字符

【5】不区分大小写的匹配

通过将re.I或re.IGNORECASE传递给re.compile()函数的第二个参数,可以使正则表达式模式不区分大小写


【6】用sub()方法替换字符串   查找:findall() search() 查找替换:sub()

>>> namesRegex = re.compile(r'Agent \w+')
>>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.')
'CENSORED gave the secret documents to CENSORED.'

【7】使用re.VERBOSE作为re.compile()的第二个参数,管理复杂的正则表达式

    忽略正则表达式字符串中的空白符和注释

【8】组合使用re.IGNOREC ASE、re.DOTALL 和re.VERBOSE

    如果希望正则表达式不区分大小写,并且句点字符匹配换行,就可以这
样构造re.compile()调用:
>>> someRegexValue = re.compile('foo', re.IGNORECASE | re.DOTALL)
    使用第二个参数的全部3 个选项,看起来像这样:
>>> someRegexValue = re.compile('foo', re.IGNORECASE | re.DOTALL | re.VERBOSE)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值