python正则表达式re.findall(r"\b\w+\b", s)中的r是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python正则表达式re.findall(r"\b\w+\b", s)中的r是啥意思?相关的知识,希望对你有一定的参考价值。

参考技术A 延伸阅读:python的
内建函数

subprocess
。此文是本系列的第三篇文章了,和之前一样,内容出自官方文档,但是会有自己的理解,并非单纯的翻译。所以,如果我理解有误,欢迎指正,谢谢。
本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮。
正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义。这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解。比如,要匹配一个反斜杆本身,你也许要用'\\\\'来做为正则表达式的字符串,因为正则表达式要是\\,而字符串里,每个反斜杆都要写成\\。
你也可以在字符串前加上
r
这个前缀来避免部分疑惑,因为
r
开头的python字符串是
raw
字符串,所以里面的所有字符都不会被转义,比如r'\n'这个字符串就是一个反斜杆加上一字母n,而'\n'我们知道这是个换行符。因此,上面的'\\\\'你也可以写成r'\\',这样,应该就好理解很多了。可以看下面这段:
参考技术B Python中字符串前面加上
r
表示原生字符串,
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
参考技术C re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。
[1]
就是列表中的[1]啊
参考技术D 在Python的string前面加上‘r’,
是为了告诉编译器这个string是个raw
string,不要转意backslash
'\'

例如,\n
在raw
string中,是两个字符,\和n,
而不会转意为换行符。由于正则表达式和
\
会有冲突,因此,当一个字符串使用了正则表达式后,最好在前面加上'r'。
例:r"\n\n\n\n\n\n”
作用:声明后面的字符串是普通字符串
特殊字符串中含有:转义字符
\n
\t
什么什么的
用途:一般用在
正则表达式、文件绝对地址
1,正则表达式:
2、系统路径
这样就不用专门的去处理引号之中的特殊字符了

Python之正则re模块 --- findall()详解

1. findall() 函数的2种表示形式

1 import re
2 kk = re.compile(r\d+)
3 kk.findall(one1two2three3four4)
4 #[1,2,3,4]
5  
6 #注意此处findall()的用法,可传两个参数;
7 kk = re.compile(r\d+)
8 re.findall(kk,"one123")
9 #[1,2,3]

2. 正则表达式可能遇到的坑  --- 正则表达式中的括号()

1. 当正则表达式中  没有括号时,就是正常匹配,如本例中"/w+/s+/w+"

在本例中"/w+/s+/w+"第一次匹配到的字符为"2345  3456",由于是贪婪模式会     继续匹配,第二次从"4567"开始匹配匹配到的结果为字符串"4567 5678"

1 import re
2 string="2345  3456  4567  5678"
3 regex=re.compile("\w+\s+\w+")
4 print(regex.findall(string))
5 #[‘2345 3456‘, ‘4567 5678‘]
6 #补充: 
7 #\s -- 匹配任何不可见字符,包括空格、制表符、换页符等等 
8 #\S -- 匹配任何可见字符 通常[/s/S] -- 可匹配任意字符
9 #[\s\S]*? -- 匹配懒惰模式的任意字符

2. 当正则表达式中有  一个括号时,如"(\w+)\s+\w+"其输出的内容就是括号匹配到的内容

原理:正则表达式中有一个括号时,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果,但是整个正则表达式执行了,只不过只输出括号匹配到的内容,

匹配过程:

  1. 第一次匹配时跟上述没有括号时一样,匹配到 "2345  3456" ,只不过只输出(/w+)匹配     到的结果 即"2345",

  2. 第二次匹配同理从"4567" 开始,匹配到"4567  5678",但是,只输出"4567"

import re
string="2345  3456  4567  5678"
regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#[‘2345‘, ‘4567‘]

3. 当正则表达式中有两个括号时,如 "((\w+)\s+\w+)",其输出结果是一个list 中包含2个 tuple

  从输出的结果可以看出,有两个元组,每一个元组中有   两个字符串 :

     其中,第一个元组种的第一个字符串"2345 3456"是最外面的括号输出的结果,第二个字符串是里面括号(/w+)输出的结果 "2345",

       第二个元组是  第二次匹配的结果 -- 详解同第一次匹配。

import re
string="2345  3456  4567  5678"
regex2=re.compile("((\w+)\s+\w+)")
print(regex2.findall(string))
#[(‘2345  3456‘, ‘2345‘), (‘4567  5678‘, ‘4567‘)]

3. findall() 使用总结:

  第一个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。

  第二个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。

  第三个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple,---  多个括号就会返回  多个括号分别匹配到的结果 

正则表达式的特点:

  1. 有括号时只能匹配到括号中的内容,没有括号就正常匹配。

  2. 在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容

 

 

 

 

 

 

以上是关于python正则表达式re.findall(r"\b\w+\b", s)中的r是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式之findall疑点

python正则表达式re.findall(r"\b\w+\b", s)中的r是啥意思?

re库和正则表达式

python:非正则表达式等价于 re.findall

python正则表达式

python 正则(re.compile()/re.findall())