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>
str = "hello, *world*"
匹配结果group(0)为pattern匹配的整个字符串。你注意一下你pattern字符串里面的()括起来的部分会被放到匿名的group(1)里面。当然你可以给分组设置名称,,
\g<number> 或\number 代表对应的分组内容。\1的就是匿名的第一个分组内容
如果你想使用匹配的完整的字符串请用\g<0>
#5
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
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>
str = "hello, *world*"
匹配结果group(0)为pattern匹配的整个字符串。你注意一下你pattern字符串里面的()括起来的部分会被放到匿名的group(1)里面。当然你可以给分组设置名称,,
\g<number> 或\number 代表对应的分组内容。\1的就是匿名的第一个分组内容
如果你想使用匹配的完整的字符串请用\g<0>
#5
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
group[1] = world 即pattern括号匹配的内容 为匿名分组1
会将你匹配pattern部分,这里只有一处,即 *world* 替换为<em>\1</em>,而\1代表group1