猿问

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

我是 Python 的初学者,遇到了一些我无法解决的编码问题。


是)我有的:


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


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


我正在尝试做的事情:使用 Python 正则表达式方法 - sub() 来查找英文句子并将其替换为各自的翻译句子。


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


我有 html 代码中每个句子的翻译。我想一次替换一个句子并保留 html 标签。通常我可以像这样使用 sub() 方法:


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


resultCode = regex1.sub(r'\1TRANSLATION_SENTENCE_HERE\2', originalHtmlCode)

我写了一个python脚本来做到这一点。我将 html 代码保存在一个 txt 文件中,并在我的 Python 代码中访问它(成功)。然后我创建一个字典来将源-目标对存储在上面提到的电子表格中(成功)。最后,我使用 rexgex sub() 方法来查找和替换 html 代码中的句子(失败)。由于某种原因,最后一部分根本不起作用。链接到我的 Python 代码- https://pastebin.com/ZSUNB4yg或以下:


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.sub(v, buynavCode)


_subx 中的文件“C:\Users\zs\AppData\Local\Programs\Python\Python36\lib\re.py”,第 326 行


模板 = _compile_repl(模板,模式)


_compile_repl 中的文件“C:\Users\zs\AppData\Local\Programs\Python\Python36\lib\re.py”,第 317 行


返回 sre_parse.parse_template(repl, 模式)


文件“C:\Users\zs\AppData\Local\Programs\Python\Python36\lib\sre_parse.py”,第 943 行,在 parse_template


addgroup(int(this[1:]), len(this) - 1)

有人可以启发我吗?我真的很感激。


胡子哥哥
浏览 151回答 1
1回答

HUX布斯

考虑是否要使用替换文本,您必须在其中放置第 1 组的内容并将它们连接到 string 2。您可以编写r'\12',但这不会起作用,因为正则表达式解析器会认为您引用的是组12而不是1字符串后面的组2!>>> re.sub(r'(he)llo', r'\12', 'hello')Traceback (most recent call last):&nbsp; File "<stdin>", line 1, in <module>&nbsp; File "/usr/lib/python3.6/re.py", line 191, in sub&nbsp; &nbsp; return _compile(pattern, flags).sub(repl, string, count)&nbsp; File "/usr/lib/python3.6/re.py", line 326, in _subx&nbsp; &nbsp; template = _compile_repl(template, pattern)&nbsp; File "/usr/lib/python3.6/re.py", line 317, in _compile_repl&nbsp; &nbsp; return sre_parse.parse_template(repl, pattern)&nbsp; File "/usr/lib/python3.6/sre_parse.py", line 943, in parse_template&nbsp; &nbsp; addgroup(int(this[1:]), len(this) - 1)&nbsp; File "/usr/lib/python3.6/sre_parse.py", line 887, in addgroup&nbsp; &nbsp; raise s.error("invalid group reference %d" % index, pos)sre_constants.error: invalid group reference 12 at position 1您可以使用\g<1>引用组的语法来解决此问题r'\g<1>2'::>>> re.sub(r'(he)llo', r'\g<1>2', 'hello')'he2'在您的情况下,您的替换字符串包含动态内容,例如str(v)可以是任何内容。如果它恰好以数字开头,那么您最终会遇到前面描述的情况,因此您想使用它\g<1>来避免此问题
随时随地看视频慕课网APP

相关分类

Python
我要回答