【问题标题】:python-docx regex search and replacepython-docx 正则表达式搜索和替换
【发布时间】:2022-06-10 22:57:01
【问题描述】:

我正在处理一个更改 docx 文件中的单词的个人项目。我使用正则表达式来查找和替换所有单词,但我对其进行了一些改进,以便能够选择要更改的单词的位置。但目前的可能性似乎不大。我希望大家可以帮助我想出解决方案。这是我使用的代码:

import docx
from docx import Document
import re



def keepfont(filename,key,value):
    doc = Document(filename)
    countKey = 0

    for p in doc.paragraphs:

        match = re.findall(key,p.text,re.IGNORECASE)
        for igkey in match:
            countKey = split_text.count(igkey)
            #print(igkey)
            split_text = p.text
            # print(key)
            inline = p.runs
            # Loop added to work with runs (strings with same style)
            for j in range(len(inline)):
                if igkey in inline[j].text:
                    print(inline[j].text)
                    #print(inline[j])
                    #print(inline[j].text)
                    text = inline[j].text.replace(key, value)
                    inline[j].text = text
                #print(p.text)
    doc.save('dest1.docx')

#path = r'文件docx的路径'
#keepfont(path,'要改变的词','改变的词')
文本示例:'Welcome to Ex COMPANY
在我们公司,你有 blala...,
这家公司会制造 blale...,
公司会给你 bolobala...,

【问题讨论】:

  • 请输入您要更改的文档中的示例段落以及当前输出以及预期为真的内容!
  • 另外,我已经解决了与此相关的问题,我认为交换两个单词的最佳方法是使用re.usbhow-to-swap-two-words-in-a-string
  • 它可以很好地更改单词,但我想要改进的是能够在特定位置更改单词。 `示例:我找到了 2 个单词 Company 和 COMPANY,但我只想更改 1 个单词 COMPANY
  • 您可以使用replace() 例如my_str= my_str.replace('COMPANY', 'THE TEXT TO BE PLACED')
  • 我的意思是在文本中有很多可能的单词行,我需要将它移动到特定位置

标签: python python-docx regexp-replace


【解决方案1】:

您使用了错误的工具。 re.findall() 不会告诉你匹配发生在哪里。与其寻找两次,不如使用re.finditer();它返回的"match objects" 将字符偏移量包含在文本中。

for m in re.finditer(key, text, re.IGNORECASE):
    print("Matched at:", m.start(), m.end(), "Text:", text[m.start():m.end()])

如果您想收集匹配项并然后做某事,请将它们收集到一个列表中。然后可以使用匹配对象all_matches[0]作为第一个匹配的位置,以此类推。

all_matches = list(re.finditer(key, text, re.IGNORECASE))
m = all_matches[2]  # replace the third match with "spam"
text = text[:m.start()] + "spam" + text[m.end():]

如果您需要匹配的文本本身,请使用m.group()。有关可以对匹配对象执行的所有其他操作,请参阅文档。

【讨论】:

  • 那么如何给它们分配序号呢?
  • 什么序号?您想知道匹配项在哪里,您可以使用我共享的代码来做到这一点。如果您还想跟踪第一、第二、第五场比赛,请这样做,例如通过使用枚举:for n, m in (enumerate(re.finditer(key, text, re.IGNORECASE): ...
  • 谢谢。我昨天想通了并完成了它,我尝试创建循环和备用匹配,但它们似乎不起作用
  • 替代匹配?仍然不知道你在说什么 :-) 但很高兴你让它工作了。
  • 是的,我只想替换我选择的单词而其他单词没有。例如:如果我找到 3 个单词,我只想替换第 2 个单词并保留 1 和 3
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2013-06-14
  • 2011-04-15
  • 1970-01-01
  • 2018-05-25
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多