鱼C论坛

 找回密码
 立即注册
查看: 1470|回复: 3

写错表达式,得出的结果看不懂

[复制链接]
发表于 2022-4-29 00:14:14 | 显示全部楼层 |阅读模式

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

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

x
>>> result = re.findall(r'(\w+)(\w+)', 'I love FishC.com!')
>>> result
[('lov', 'e'), ('Fish', 'C'), ('co', 'm')]

>>> result = re.findall(r'(\w+)(\w+)', 'I love FishC_com!')
>>> result
[('lov', 'e'), ('FishC_co', 'm')]

为什么会得到上面的结果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-30 00:09:34 | 显示全部楼层
本帖最后由 suchocolate 于 2022-4-30 21:44 编辑

有无()组
1)re.findall默认把pattern当作一个大的()组,如其中没有空号,显示的结果就是字符串组成的列表:
import re
pattern = "\d[a-zA-Z]"   # 外层隐含着()
s = "ddd.111kkkk6666lll"
result = re.findall(pattern, s)
print(result)
pattern2 = "(\d[a-zA-Z])"    # 直接加一个()看看结果
result = re.findall(pattern2, s)
print(result)
输出结果都是:
['1k', '6l']
['1k', '6l']

2)如果pattern里有括号(),那么根据()括号的数目,以元组组成的列表显示:
import re
pattern = "(\d)([a-zA-Z])"
s = "ddd.111kkkk6666lll"
result = re.findall(pattern, s)
print(result)
输出结果:
[('1', 'k'), ('6', 'l')]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-30 16:37:14 | 显示全部楼层
本帖最后由 lzb1001 于 2022-4-30 16:53 编辑
suchocolate 发表于 2022-4-30 00:09
有无()组
1)re.findall默认把pattern当作一个大的()组,如其中没有空号,显示的结果就是字符串组成的列表 ...


感谢大神的解疑释惑

既然可以用()分组:

>>> result = re.findall(r'(\w+)(\w+)', 'I love FishC.com!')
>>> result
[('lov', 'e'), ('Fish', 'C'), ('co', 'm')]

但下面得到的result却没有()分组:

>>> result = re.findall(r'\w+|\s|\.|!', 'I love FishC_com!')
>>> result
['I', ' ', 'love', ' ', 'FishC_com', '!']

但如果我想得出的结果格式如下所示,应如何书写代码……呢?

>>> ……
>>> result
[('I'), (''), ('love'), (''), ('FishC_com'), ('!')]

我试着这样写,但得到的结果只有一个():

>>> result = re.findall(r'(\w+)(\s)(\w+)(\s)(\w+)(!)', 'I love FishC_com!')
>>> result
[('I', ' ', 'love', ' ', 'FishC_com', '!')]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-30 21:43:03 | 显示全部楼层
有点异想天开了吧
[('1', 'k'), ('6', 'l')]
红色:匹配第一次,一次两个元素,也就是说,结果的括号表示匹配一次,括号里的元素个数是pattern里写的小括号的个数。
蓝色:匹配第二次,同上。

按照你的预想结果:[('I'), (''), ('love'), (''), ('FishC_com'), ('!')]
就得匹配6次,但是每次匹配,元素只有一个,那么说明你的patter里就只有一小括号,或者没有,这样re就会自动去掉括号,变成
['I', ' ', 'love', ' ', 'FishC_com', '!'],所以你的预想不会实现。

另外,得出['I', ' ', 'love', ' ', 'FishC_com', '!']的简单写法:
result = re.findall(r'\w+|\W', 'I love FishC_com!')
print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 12:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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