在学习python正则表达式的过程中一直对为什么要加原生字符串非常不理解,也不清楚为什么要使用"\b",经过讨论有一点新的收获,还不知道是否正确,现总结出来,望看到的伙伴多多评论,多多指正。
1.正则表达式
首先要清楚正则表达式是用于处理字符串的强大工具,它并不是python的一部分,而是嵌入python的微小的、高度专业化的语言。正则表达式拥有自己独特的语法。
不同的语言均有使用正则表达式的方法,各不相同,python通过re模块来实现。
2. 转义字符(以前的笔记引用别人的,忘记在哪里看的了,感谢!)
转义字符不是python这门语言所独有的,准确的讲,这是一个计算机专业词汇。
在计算机当中,我们可以写出123 ,也可以写出字母abcd,
但有些字符我们无法手动书写,比如我们需要对字符进行换行处理,但不能写出来换行符,当然我们也看不见换行符。
像这种情况,我们需要在字符中使用特殊字符时,就需要用到转义字符。
3. “\b”的特殊
但在python中"\b"表示退格符,删去前面一个字符。
# 在python中:\b: 退格符
a = '我今天不吃火锅'
b = '我今天不\b吃火锅'
print('a的输出结果:', a)
print('b的输出结果:', b)
而在正则表达式中"\b"是表示匹配单词的开始或结尾。
针对这种情况,当我们在python正则表达式中使用"\b"时,我们希望"\b"依照正则的解析方式,而不是python的解析方式,因此,需要在前面加上r(raw string),告诉python不先使用python的方式对r后面的字符串进行解析,而是保留原样。
当给定一组字符串
q = 'my shop name My_SHOP my_shop '
我们想找出所有以m开头的字符串时,可以使用的正则表达式为
'\bm\w*\b'
但是当我们将上面这个模块放入python,发现python按照退格符解析该模块
q = 'my shop name My_SHOP my_shop '
pattern = '\bm\w*\b'
print(pattern)
输出结果为:
但是我们使用python并放在正则表达式中不希望"\b"解析为退格符,此时可以使用r模式
pattern1 = r'\bm\w*\b'
print(pattern1)
结果为:
因此当在python中使用正则表达式时,为了避免python对模式字符串按照python语法而非正则语法进行解析,我们需要使用r
q = 'my shop name My_SHOP my_shop '
pattern = '\bm\w*\b'
pattern1 = r'\bm\w*\b'
res = re.findall(pattern1, q, re.I) # 找到以m开头的单词,不区分大小写
print(pattern)
print(pattern1)
print(res)
此时,模块字符串将不被提前解析,而被按照原本的 '\bm\w*\b’带入findall函数。
这样模块字符串才是正确的。而没有r的 '\bm\w*\b’即pattern代表的字段,再进行findall函数计算前,已被解析为"m\w" 字符串,而非需要的正则表达式。