Python中正则表达式反向引用的问题

时间:2017-09-29 19:57:46

标签: python regex python-3.x

我在Python的正则表达式中使用群组反向引导来尝试理解它们并且我没有太多运气。

import re

leftQuotes = re.compile("((\"|\“)([\w|\d]))")
rightQuotes = re.compile("(([\w|\d])(\"|\”))")

s = "This is “problematic”"

s = re.sub(leftQuotes, r'‘\3', s)
s = re.sub(rightQuotes, r'’\3', s)

print(s)

输出:

This is ‘problemati’”

在第一个re.sub()中,我设法用一个左引号成功替换左双引号,同时保留匹配字符(在本例中为" p")。但是无论组反向引用(1,2,3),右侧都不会以相同的方式运行。

反向引用的结果:

\1: ‘problemati’c” 
\2: ‘problemati’c 
\3: ‘problemati’”

1 个答案:

答案 0 :(得分:2)

要修复代码,请将第二个sub替换为:

s = re.sub(rightQuotes, r'\2’', s)

应该可以工作,因为第二个模式中的单词字符作为第二个捕获组出现,它也应该在单引号替换之前出现。

此外,你不需要在这里真正需要捕获组,使用环顾四周会更干净(虽然不是关键引用带单引号的字符串可以为你节省一些输入@ CasimiretHippolyte&# 39;评论):

import re
​
leftQuotes = re.compile('(?:"|“)(?=\w)')
rightQuotes = re.compile('(?<=\w)(?:"|”)')
​
s = "This is “problematic”"
​
s = re.sub(leftQuotes, r'‘', s)
s = re.sub(rightQuotes, r'’', s)
​
s
# 'This is ‘problematic’'

此外,由于\w包含\d[\w|\d]可以替换为\w