鱼C论坛

 找回密码
 立即注册
查看: 1188|回复: 10

正则表达式findall()函数问题

[复制链接]
发表于 2019-6-4 21:43:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MrClown 于 2019-6-4 22:08 编辑

求教大神看到正则表达式时候
  1. import re
  2. p= re.compile('([^}]*)',re.VERBOSE)
  3. p.findall('section{First}')
  4. ‘结果是:’
  5. ['section{First', '', '']
复制代码


实在想不明白为什么返回的结果后面有两个空的字符呢?难不成是section{First这里匹配了空的值}结束的这个位置又匹配了一次么?
如果是这样的话为什么开头的空值还有每个单子字母间的空值没有匹配呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-4 22:08:31 | 显示全部楼层
我也没太懂,不过换成print(p.search('section{First}').group())就没有空格了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-4 22:21:27 | 显示全部楼层
大裤衩子 发表于 2019-6-4 22:08
我也没太懂,不过换成print(p.search('section{First}').group())就没有空格了

是啊 其实
  1. p= re.compile('([^}]+)',re.VERBOSE)
复制代码
就可以 但就是这两个空字符给我整不会了,正常空匹配只有在它们没有紧挨着前一个匹配时才会被替换掉。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-4 22:42:20 | 显示全部楼层
本帖最后由 °蓝鲤歌蓝 于 2019-6-4 23:29 编辑

好问题
  1. p= re.compile('(^[^}]*)',re.VERBOSE)
复制代码

试试
其实列表里最后一个空字符是可以理解的
因为  * 就匹配 0/多次
匹配 0 次的时候就是 '' 空字符
例如
  1. re.findall("a*", "")
复制代码


比较难理解的是第二个空字符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-4 23:30:09 | 显示全部楼层

就是section{First}为头去匹配了呗,但是为什么不加边界或者限定条件 就会匹配两个空,这两个空字符是怎么匹配的呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-4 23:54:47 | 显示全部楼层
本帖最后由 MrClown 于 2019-6-5 00:06 编辑


我试了下 单独输入‘}’也就是 p.findall('}')会得到['', '']是不是这个意思,当出现‘}’符号的时候[^}]不匹配,就是没有,也就是空,所以*这里就配了一次空字符出现了第一个'',而第二个空字符是指"}"后面也就是结尾处没有了,也就匹配了0次所以又产生了一次'',所以就有两个空字符呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 00:02:05 | 显示全部楼层
MrClown 发表于 2019-6-4 23:30
就是section{First}为头去匹配了呗,但是为什么不加边界或者限定条件 就会匹配两个空,这两个空字符是怎 ...

首先列表中的第一个字符串
  1. 'section{First'
复制代码

是第一次匹配到的
列表的第二个空字符其实相当于在字符串 '}'(前面的 'section{First' 匹配过了,相当于被消耗了) 中进行匹配,这时候返回 '' (这个空字符我也不是很明白)
第三个空字符就是在 '' (第二次的 '}' 也被消耗掉了) 中进行匹配,返回 '' ,因为 * 就是匹配 0/多次,'' 空字符是满足其匹配 0 次的条件的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-5 00:33:11 | 显示全部楼层
本帖最后由 MrClown 于 2019-6-5 00:35 编辑
°蓝鲤歌蓝 发表于 2019-6-5 00:02
首先列表中的第一个字符串

是第一次匹配到的


非常感谢您的回答 但我还是有点蒙脑袋想的有点炸,都已经匹配过了消耗掉了,位置就移动了,不应该在返回去匹配消耗掉的部分啊,我总感觉貌似是当出现‘}’符号的时候[^}]不匹配,就是没有,也就是空,所以*这里就配了一次空字符出现了第一个'',而第二个空字符是指"}"后面也就是结尾处没有了,也就匹配了0次所以又产生了一次'',所以就有两个空字符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 00:43:59 | 显示全部楼层
MrClown 发表于 2019-6-5 00:33
非常感谢您的回单 但我还是有点蒙脑袋想的有点炸,都已经匹配过了消耗掉了,位置就移动了,不应该在返回 ...

你第二个空字符的说法我是支持的,第一个空字符的说法我也想过,但是我感觉不合理。
1. findall() 返回的是满足匹配条件的字符串的列表, 这个字符 '}' 是不满足匹配条件的,假设它满足匹配条件,那匹配结果也不该为 '',而应该是它本身 '}'
2. 如果你说的是事实,那么
  1. p= re.compile('([^}]+)',re.VERBOSE)
复制代码
应该也会有空字符
3. 按照 1、2所说,我推测的结果是 '}' 是满足匹配条件(满足 * 匹配 0 次,而不是匹配多次)的,所以才会出现 * 有空字符而 + 没有空字符
4. 按照 3 所说,又会出现一个新的问题,就是 “为什么 '}' 会满足匹配条件(匹配 0 次)?”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 00:44:46 | 显示全部楼层
我睡觉了。
明天再上来看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-5 21:27:01 | 显示全部楼层
本帖最后由 MrClown 于 2019-6-5 22:04 编辑
°蓝鲤歌蓝 发表于 2019-6-5 00:43
你第二个空字符的说法我是支持的,第一个空字符的说法我也想过,但是我感觉不合理。
1. findall() 返回 ...


  1. p.sub('@','section{First}')
复制代码

得出
  1. '@@}@'
复制代码
  1. p.split('section{First}')
复制代码

得出
  1. ['', 'section{First', '', '', '}', '', '']
复制代码

可以看出p.findall('section{First}')中就是匹配了'section{First}',和符号'}'两边的空字符'',''。最后一个空字符应该就是结束的''被匹配了,但是第一个空''是怎么匹配的我还是没想明白,如果要匹配空字符的话
  1. p= re.compile('([^}*])',re.VERBOSE)
  2. p.findall('section{First}')
复制代码

的结果为什么就没有匹配到''字符 结果是:
  1. ['s', 'e', 'c', 't', 'i', 'o', 'n', '{', 'F', 'i', 'r', 's', 't']
复制代码


还有就是p= re.compile('([^}]+)',re.VERBOSE)可以匹配到'section{First'的原因就是因为有+号,小甲鱼是这么写的“+,用于指定前一个字符匹配一次或者多次” 我是这么理解的不知道对不,就是必须得匹配一个字符不可以是空字符,如果是空字符''就不满足匹配所以p= re.compile('([^}]+)',re.VERBOSE)就不会有空字符出现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 06:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表