关于正则表达式的简单问题,希望大家帮忙解释下。万分感谢。

时间:2021-08-25 18:46:13
"""

emphasis_pattern = r'\*([^\*]+)\*'
str = "hello, *world*"
str2 = re.sub(emphasis_pattern,r'<em>\1</em>',str)
print(str2)
#输出结果:  hello, <em>world</em>
str4 =re.sub(emphasis_pattern,r'<em>\0</em>',str)
print(str4)
#输出结果:  hello, <em> </em>
"""
    问题,为什么正则表达式替换后的输出结果是如此呢。
    在我的理解范围之内,应该都是如同下面的str3一样。这个反斜杠加1,加0,分别代表了什么呢。
    str2 应该是 hello, <em>\1</em> 
    str4 应该是 hello, <em>\0</em>
    
    上面有关于匹配对象与组的概念,感觉跟这个0和1有一定的关联,但也没办法理解.
    就像在这个例子里,组0,组1,分别是什么呢.
    
    正则表达式有必要研究得过深么?一直都看着很头疼.
    
    
"""
str3 = re.sub('o',"abc",str)
print(str3)

#输出结果:  hellabc, *wabcrld*

6 个解决方案

#1


"""
        匹配对象与组
        There (was a (wee) (cooper)) who (lived in Fyfe)
        
        0:      There was a wee cooper who lived in Fyfe
        1:      was a wee cooper
        2:      wee
        3:      cooper
        4:       lived in Fyfe
        
        
"""

#2


\1就是匹配的第一个分组。

#3


\0   \1可能会引起歧义,所以最好用\g<0>,  \g<1>

#4


emphasis_pattern = r'\*([^\*]+)\*'
str = "hello, *world*"

匹配结果group(0)为pattern匹配的整个字符串。你注意一下你pattern字符串里面的()括起来的部分会被放到匿名的group(1)里面。当然你可以给分组设置名称,,
\g<number> 或\number 代表对应的分组内容。\1的就是匿名的第一个分组内容
如果你想使用匹配的完整的字符串请用\g<0>

#5


引用 4 楼 hbu_pig 的回复:
emphasis_pattern = r'\*([^\*]+)\*'
str = "hello, *world*"

匹配结果group(0)为pattern匹配的整个字符串。你注意一下你pattern字符串里面的()括起来的部分会被放到匿名的group(1)里面。当然你可以给分组设置名称,,
\g<number> 或\number 代表对应的分组内容。\1的就是匿名的第一个分组内容
如果你想使用匹配的完整的字符串请用\g<0>



emphasis_pattern = r'\*([^\*]+)\*'
str = "hello, *world*"
str2 = re.sub(emphasis_pattern,r'<em>\1</em>',str)
print(str2)
#输出结果:  hello, <em>world</em>
"""
    很谢谢你,可我还是有些难以理解。
    
    对于这几行代码,我的想法是这样的。
    1,   r'\*([^\*]+)\*'
          该正则表达式的意义是:
          \*            表示开头为*,
          ([^\*]+)      表示中间为为一串不是*号的字符
          \*            表示结尾为*
          
    2,那么在这个str="hello, *world*" 这个字符串里,该正则表达式匹配的对象为
       *world*
       group[0] = hello, *world*
       group[1] = *world*
       
    3,执行   str2 = re.sub(emphasis_pattern,r'<em>\1</em>',str)  时,
       sub函数开始会找到匹配项,*world*,然后将这些内容删除。 
       之后在该删除的位置加入   <em>\1</em> 完成替换。此时字符串为 hello,<em>\1</em>
       然后,对\1  进行替换,替换成组1的内容。组1的内容为  *world*
       那么随后,字符串应该变为  hello,<em>*world*</em>
       
    我的理解,哪些地方错了呢。
    
          
"""

#6


 group[0] = *world* pattern匹配的整个字符串,以*开始*结束
group[1] = world  即pattern括号匹配的内容 为匿名分组1

会将你匹配pattern部分,这里只有一处,即 *world* 替换为<em>\1</em>,而\1代表group1

#1


"""
        匹配对象与组
        There (was a (wee) (cooper)) who (lived in Fyfe)
        
        0:      There was a wee cooper who lived in Fyfe
        1:      was a wee cooper
        2:      wee
        3:      cooper
        4:       lived in Fyfe
        
        
"""

#2


\1就是匹配的第一个分组。

#3


\0   \1可能会引起歧义,所以最好用\g<0>,  \g<1>

#4


emphasis_pattern = r'\*([^\*]+)\*'
str = "hello, *world*"

匹配结果group(0)为pattern匹配的整个字符串。你注意一下你pattern字符串里面的()括起来的部分会被放到匿名的group(1)里面。当然你可以给分组设置名称,,
\g<number> 或\number 代表对应的分组内容。\1的就是匿名的第一个分组内容
如果你想使用匹配的完整的字符串请用\g<0>

#5


引用 4 楼 hbu_pig 的回复:
emphasis_pattern = r'\*([^\*]+)\*'
str = "hello, *world*"

匹配结果group(0)为pattern匹配的整个字符串。你注意一下你pattern字符串里面的()括起来的部分会被放到匿名的group(1)里面。当然你可以给分组设置名称,,
\g<number> 或\number 代表对应的分组内容。\1的就是匿名的第一个分组内容
如果你想使用匹配的完整的字符串请用\g<0>



emphasis_pattern = r'\*([^\*]+)\*'
str = "hello, *world*"
str2 = re.sub(emphasis_pattern,r'<em>\1</em>',str)
print(str2)
#输出结果:  hello, <em>world</em>
"""
    很谢谢你,可我还是有些难以理解。
    
    对于这几行代码,我的想法是这样的。
    1,   r'\*([^\*]+)\*'
          该正则表达式的意义是:
          \*            表示开头为*,
          ([^\*]+)      表示中间为为一串不是*号的字符
          \*            表示结尾为*
          
    2,那么在这个str="hello, *world*" 这个字符串里,该正则表达式匹配的对象为
       *world*
       group[0] = hello, *world*
       group[1] = *world*
       
    3,执行   str2 = re.sub(emphasis_pattern,r'<em>\1</em>',str)  时,
       sub函数开始会找到匹配项,*world*,然后将这些内容删除。 
       之后在该删除的位置加入   <em>\1</em> 完成替换。此时字符串为 hello,<em>\1</em>
       然后,对\1  进行替换,替换成组1的内容。组1的内容为  *world*
       那么随后,字符串应该变为  hello,<em>*world*</em>
       
    我的理解,哪些地方错了呢。
    
          
"""

#6


 group[0] = *world* pattern匹配的整个字符串,以*开始*结束
group[1] = world  即pattern括号匹配的内容 为匿名分组1

会将你匹配pattern部分,这里只有一处,即 *world* 替换为<em>\1</em>,而\1代表group1