如何迭代计数器并将其包含在字符串替换中? (Python)

How do I iterate a counter and include it in a string replacement? (Python)

我正在使用 Python 3.6。我有一个源文件 (txt),每个句子都添加了 <s></s> 标签。源文件中可能有几百个句子。 (我会有很多这样的源文件,但现在我只处理一个。)我想搜索文本,找到每个出现的 <s> 并将其替换为 <s n="x"> 其中 x 是一个从 1 开始的计数器,每个句子在 n="x" 属性中都有一个 x 的序号。完成的文本应如下所示:

<s n="1">This is the first sentence. </s><s n="2">This is the second sentence. </s> … <s n="nth">This is the nth sentence.</s>

我只需要更改开始标记中的数字,这与句子中的文本无关。

我想做这样的事情:

file_handle = open(file, 'r')
file_string = file_handle.read()
file_handle.close()

for counter, '<s>' in file_string:
    file_string = file_string.replace('<s>', '<s n="' + str(counter) + '">')

我知道前三行不是 Pythonic,但它们在这种情况下发挥了作用(意味着获取字符串)。如果我应该使用字符串以外的东西,那么前三行需要更改。问题是,对于 file_string 中 <s> 的每个连续实例,我都没有尝试导致计数器移动到 counter+1。我得到的最好的是每个句子都有 <s n="1"> 作为开始标记。

我尝试了枚举、替换、re.sub、匹配的各种组合,我面临着新手的经典“这很容易,但我看不到”的问题。 None 在我进行的搜索中找到了这个嵌入式计数器概念。

我怎样才能完成这个简单的任务?

作为初步,我创建 some_text 与您可能拥有的类似。

>>> some_text = 50*'<s>One sentence</s>'
>>> some_text
'<s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s><s>One sentence</s>'

现在我可以使用正则表达式来识别每个 <s> 字符串,然后调用它的 .sub 方法来替换任何 do_it 函数 returns那个字符串。

>>> n = 0
>>> import re
>>> def do_it(matchobj):
...     global n
...     n+=1
...     return '<s n="%s">'%n
... 
>>> re.sub(r'<s>', do_it, some_text)
'<s n="1">One sentence</s><s n="2">One sentence</s><s n="3">One sentence</s><s n="4">One sentence</s><s n="5">One sentence</s><s n="6">One sentence</s><s n="7">One sentence</s><s n="8">One sentence</s><s n="9">One sentence</s><s n="10">One sentence</s><s n="11">One sentence</s><s n="12">One sentence</s><s n="13">One sentence</s><s n="14">One sentence</s><s n="15">One sentence</s><s n="16">One sentence</s><s n="17">One sentence</s><s n="18">One sentence</s><s n="19">One sentence</s><s n="20">One sentence</s><s n="21">One sentence</s><s n="22">One sentence</s><s n="23">One sentence</s><s n="24">One sentence</s><s n="25">One sentence</s><s n="26">One sentence</s><s n="27">One sentence</s><s n="28">One sentence</s><s n="29">One sentence</s><s n="30">One sentence</s><s n="31">One sentence</s><s n="32">One sentence</s><s n="33">One sentence</s><s n="34">One sentence</s><s n="35">One sentence</s><s n="36">One sentence</s><s n="37">One sentence</s><s n="38">One sentence</s><s n="39">One sentence</s><s n="40">One sentence</s><s n="41">One sentence</s><s n="42">One sentence</s><s n="43">One sentence</s><s n="44">One sentence</s><s n="45">One sentence</s><s n="46">One sentence</s><s n="47">One sentence</s><s n="48">One sentence</s><s n="49">One sentence</s><s n="50">One sentence</s>'