使用sub()方法将html代码中的内容替换为相应的翻译时出现Python正则表达式问题

使用sub()方法将html代码中的内容替换为相应的翻译时出现Python正则表达式问题,python,regex,Python,Regex,各位。我是一名翻译,自学了一些Python。我遇到了一些我无法解决的编码问题 我所拥有的: 电子表格中两列的源语句及其各自的翻译 包含句子和html标记的html代码 我想做的是:使用Python正则表达式方法-sub查找英语句子并将其替换为各自的翻译句子 例如:html代码中的三个句子- 美洲狮是大型动物。 它们在美国被发现。 他们不吃草 我有html代码中每个句子的翻译。我想一次替换一个句子,同时保留html标记。通常我可以使用如下子方法: regex1 = re.compile(r'(\&

各位。我是一名翻译,自学了一些Python。我遇到了一些我无法解决的编码问题

我所拥有的:

电子表格中两列的源语句及其各自的翻译

包含句子和html标记的html代码

我想做的是:使用Python正则表达式方法-sub查找英语句子并将其替换为各自的翻译句子

例如:html代码中的三个句子- 美洲狮是大型动物。 它们在美国被发现。 他们不吃草

我有html代码中每个句子的翻译。我想一次替换一个句子,同时保留html标记。通常我可以使用如下子方法:

regex1 = re.compile(r'(\>.*)SOURCE_SENTENCE_HERE ?(.*\<)')

resultCode = regex1.sub(r'\1TRANSLATION_SENTENCE_HERE\2', originalHtmlCode)
为此,我编写了一个python脚本。我将html代码保存在txt文件中,并在Python代码中访问它。然后我创建了一个字典,将源目标对存储在上面提到的电子表格中。最后,我使用rexgex sub方法查找并替换html代码中失败的句子。由于某种原因,最后一部分根本不起作用。链接到我的Python代码-或以下链接:

import re, openpyxl, pyperclip

buynavFile = open('C:\\Users\\zs\\Documents\\PythonScripts\\buynavCode.txt')
buynavCode = buynavFile.read()
buynavFile.close()

wb = openpyxl.load_workbook('buynavSegments.xlsx')              
sheet = wb.get_sheet_by_name('Sheet1')                          
segDict = {}
maxRow = sheet.max_row
for i in range(2, maxRow + 1):
    segDict[sheet.cell(row=i, column=3).value] = sheet.cell(row=i, column=4).value

for k, v in segDict.items():                            
    k = '(\\>.*)' + str(k) + ' ?(.*\\<)'                
    v = '\\1' + str(v) + '\\2'                          
    buynavRegex = re.compile(k)
    buynavResult = buynavRegex.sub(v, buynavCode)

pyperclip.copy(buynavResult)                            
print('Result copied to clipboard')
错误消息如下:

回溯最近一次呼叫上次:

文件C:\Users\zs\Documents\PythonScripts\buynav.py,第20行,在

buynavResult=buynavRegex.subv,buynavCode

文件C:\Users\zs\AppData\Local\Programs\Python\Python36\lib\re.py, 第326行,in_subx

模板=\u编译\u复制模板,模式

文件C:\Users\zs\AppData\Local\Programs\Python\Python36\lib\re.py, 第317行,in_compile_repl

返回sre_parse.parse_templaterepl,pattern

文件 C:\Users\zs\AppData\Local\Programs\Python\Python36\lib\sre\u parse.py, 第943行,在parse_模板中

addgroupintthis[1:],lenthis-1

文件 C:\Users\zs\AppData\Local\Programs\Python\Python36\lib\sre\u parse.py, 第887行,在addgroup中

raise s.ERROR无效的组参考%d%索引,位置

sre_constants.error:位置1处的组引用11无效


有人能告诉我这件事吗?我非常感谢。

考虑是否要使用替换文本,其中必须放置组1的内容并将其连接到字符串2。您可以编写r'\12',但这不起作用,因为正则表达式解析器会认为您引用的是组12,而不是后面跟字符串2的组1

您可以使用\g语法来引用组:r'\g2'来解决此问题:


在您的情况下,替换字符串包含动态内容,如strv,它可以是任何内容。如果它恰好以一个数字开头,则在前面描述的情况下,您将使用\g来避免此问题。

请注意,在每个循环中,buynavResult将被覆盖,而不是附加到。另外,我会考虑用LXML之类的方法来遍历DOM,而不是使用正则表达式。非常感谢!
>>> re.sub(r'(he)llo', r'\12', 'hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/re.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/usr/lib/python3.6/re.py", line 326, in _subx
    template = _compile_repl(template, pattern)
  File "/usr/lib/python3.6/re.py", line 317, in _compile_repl
    return sre_parse.parse_template(repl, pattern)
  File "/usr/lib/python3.6/sre_parse.py", line 943, in parse_template
    addgroup(int(this[1:]), len(this) - 1)
  File "/usr/lib/python3.6/sre_parse.py", line 887, in addgroup
    raise s.error("invalid group reference %d" % index, pos)
sre_constants.error: invalid group reference 12 at position 1
>>> re.sub(r'(he)llo', r'\g<1>2', 'hello')
'he2'