\1 典型问题:
python 下面的正则表达式为什么加上\1就能匹配到 不加就匹配不到
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)