为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2022-05-19 13:56:29
我是 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, pyperclipbuynavFile = 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_rowfor i in range(2, maxRow + 1):    segDict[sheet.cell(row=i, column=3).value] = sheet.cell(row=i, column=4).valuefor 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_templateaddgroup(int(this[1:]), len(this) - 1)有人可以启发我吗?我真的很感激。
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

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


>>> 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

您可以使用\g<1>引用组的语法来解决此问题r'\g<1>2'::


>>> re.sub(r'(he)llo', r'\g<1>2', 'hello')

'he2'

在您的情况下,您的替换字符串包含动态内容,例如str(v)可以是任何内容。如果它恰好以数字开头,那么您最终会遇到前面描述的情况,因此您想使用它\g<1>来避免此问题


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信