鱼C论坛

 找回密码
 立即注册
查看: 1274|回复: 5

[已解决]同样是删除[#]的中括号[],开启verbose返回None,而未开启verbose可以正常返回?

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

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

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

x
本帖最后由 lzb1001 于 2022-4-28 14:30 编辑

同样是删除[#]的中括号[],为什么……

---以下开启verbose返回None?

import re

charref = re.compile(r'''  # r + '字符串' = 原始字符串
&#                       # 开始数字引用
(
    0[0-9]+                # 八进制格式
    |[0-9]+                # 十进制格式
    |x[a-zA-Z0-9]+         # 十六进制格式
)
;                          # 分号结尾
''', re.X)

'''
十进制数字10的进制值依次如下:

     ---8进制


      ---10进制


      ---16进制
'''

t1 = charref.match('')
print(t1)

t2 = charref.match('
')
print(t2)

t3 = charref.match('
')
print(t3)

运行后结果如下:

None
None
None


------------------------------------------

---以下未开启verbose可以正确返回!


import re


charref = re.compile('&#(0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')


'''
十进制数字10的进制值依次如下:

     ---8进制


      ---10进制


      ---16进制
'''

t1 = charref.match('')
print(t1)

t2 = charref.match('
')
print(t2)

t3 = charref.match('
')
print(t3)

运行后结果如下:

<re.Match object; span=(0, 6), match='&#012;'>
<re.Match object; span=(0, 5), match='&#10;'>
<re.Match object; span=(0, 5), match='&#xA;'>


【问题】:

1、为什么会不一样的结果?

2、&、#、[ ]的作用?#和[#]的区别?
最佳答案
2022-4-28 14:28:57
因为开启 verbose 的话,# 就被当成注释的标志,你应该加个 \ 来转义

对你的代码修改如下(修改了第四行):
import re

charref = re.compile(r'''  # r + '字符串' = 原始字符串
&\#                       # 开始数字引用
(
    0[0-9]+                # 八进制格式
    |[0-9]+                # 十进制格式
    |x[a-zA-Z0-9]+         # 十六进制格式
)
;                          # 分号结尾
''', re.X)

t1 = charref.match('')
print(t1)

t2 = charref.match('
')
print(t2)

t3 = charref.match('
')
print(t3)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-28 14:28:57 | 显示全部楼层    本楼为最佳答案   
因为开启 verbose 的话,# 就被当成注释的标志,你应该加个 \ 来转义

对你的代码修改如下(修改了第四行):
import re

charref = re.compile(r'''  # r + '字符串' = 原始字符串
&\#                       # 开始数字引用
(
    0[0-9]+                # 八进制格式
    |[0-9]+                # 十进制格式
    |x[a-zA-Z0-9]+         # 十六进制格式
)
;                          # 分号结尾
''', re.X)

t1 = charref.match('')
print(t1)

t2 = charref.match('
')
print(t2)

t3 = charref.match('
')
print(t3)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-28 14:38:14 | 显示全部楼层
本帖最后由 lzb1001 于 2022-4-28 14:41 编辑
isdkz 发表于 2022-4-28 14:28
因为开启 verbose 的话,# 就被当成注释的标志,你应该加个 \ 来转义

对你的代码修改如下(修改了第四行 ...


一语惊醒梦中人!感谢大神的热心的解疑释惑,所以:

charref = re.compile('&[#](0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')

其中#左右的[ ]其实可以不要,即可以直接写成:

# charref = re.compile('&#(0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')

而开启verbose后,#被当成注释的标志,所以代码中加个 \ 来转义,即:

charref = re.compile(r'''  # r + '字符串' = 原始字符串
&\#
……

是这个意思吗?

那教材中为什么用[#]而不是反斜杠\#,即写成:

charref = re.compile(r'''  # r + '字符串' = 原始字符串
&[#]
……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 14:41:08 | 显示全部楼层
lzb1001 发表于 2022-4-28 14:38
感谢大神的热心解答,所以

charref = re.compile('&[#](0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')

对的,至于为什么要加 [] ,我在你另一个帖子里已经回复了,[] 里面的字符(反斜杠除外)会被当成普通的字符,

即失去它的特殊功能,所以使用 [] 也是为了取消它的注释作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-28 14:50:41 | 显示全部楼层
isdkz 发表于 2022-4-28 14:41
对的,至于为什么要加 [] ,我在你另一个帖子里已经回复了,[] 里面的字符(反斜杠除外)会被当成普通的 ...

如果这样说的话:

教材中charref = re.compile('&#(0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')

不是最好要写成:charref = re.compile('&[#](0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')

不然,charref = re.compile('&#(0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')中#后面的岂不都被当成注释?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-28 14:52:51 | 显示全部楼层
lzb1001 发表于 2022-4-28 14:50
如果这样说的话:

教材中charref = re.compile('&#(0[0-9]+|[0-9]+|x[a-zA-Z0-9]+);')

verbose 有 verbose 的好处,# 你可以用 [] 或者 \ 来取消它的注释功能,

如果你的正则表达式太长的话分多行来写和写注释有助于别人理解你的代码,

也方便自己日后阅读
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 14:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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