lzb1001 发表于 2022-4-28 14:24:22

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

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

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

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

import re

charref = re.compile(r'''# r + '字符串' = 原始字符串
&#                     # 开始数字引用
(
    0+                # 八进制格式
    |+                # 十进制格式
    |x+         # 十六进制格式
)
;                        # 分号结尾
''', 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+|+|x+);')


'''
十进制数字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=' '>
<re.Match object; span=(0, 5), match='&#10;'>
<re.Match object; span=(0, 5), match='&#xA;'>

【问题】:

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

2、&、#、[ ]的作用?#和[#]的区别?

isdkz 发表于 2022-4-28 14:28:57

因为开启 verbose 的话,# 就被当成注释的标志,你应该加个 \ 来转义

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

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

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

t2 = charref.match('&#10;')
print(t2)

t3 = charref.match('&#xA;')
print(t3)

lzb1001 发表于 2022-4-28 14:38:14

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

isdkz 发表于 2022-4-28 14:28
因为开启 verbose 的话,# 就被当成注释的标志,你应该加个 \ 来转义

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

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

charref = re.compile('&[#](0+|+|x+);')

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

# charref = re.compile('&#(0+|+|x+);')

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

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

是这个意思吗?

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

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

isdkz 发表于 2022-4-28 14:41:08

lzb1001 发表于 2022-4-28 14:38
感谢大神的热心解答,所以

charref = re.compile('&[#](0+|+|x+);')


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

即失去它的特殊功能,所以使用 [] 也是为了取消它的注释作用

lzb1001 发表于 2022-4-28 14:50:41

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

如果这样说的话:

教材中charref = re.compile('&#(0+|+|x+);')

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

不然,charref = re.compile('&#(0+|+|x+);')中#后面的岂不都被当成注释?

isdkz 发表于 2022-4-28 14:52:51

lzb1001 发表于 2022-4-28 14:50
如果这样说的话:

教材中charref = re.compile('&#(0+|+|x+);')


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

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

也方便自己日后阅读
页: [1]
查看完整版本: 同样是删除[#]的中括号[],开启verbose返回None,而未开启verbose可以正常返回?