【问题标题】:How do I iterate a counter and include it in a string replacement? (Python)如何迭代计数器并将其包含在字符串替换中? (Python)
【发布时间】:2017-08-11 17:03:50
【问题描述】:

我正在使用 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 中 &lt;s&gt; 的每个连续实例的计数器移动到 counter+1。我得到的最好的结果是每个句子都有&lt;s n="1"&gt;作为开始标签。

我尝试了枚举、替换、re.sub、匹配的各种组合,我正面临一个经典的新手“这很容易但我看不到”的问题。我所做的搜索都没有发现这个嵌入式计数器概念。

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

【问题讨论】:

    标签: python-3.x loops str-replace


    【解决方案1】:

    作为初步,我创建 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>'
    

    现在我可以使用正则表达式来识别每个&lt;s&gt; 字符串,然后调用其.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>'
    

    【讨论】:

    • 这行得通,尽管我确实必须在 %s 周围添加“”,因为我正在做的 XML 标记需要它们。谢谢。
    • @kgrady:你能接受我的回答吗?
    • 对不起,我以为我有!我的错。
    • 不用担心。我喜欢他们,这是 SO 礼仪的一部分,除非我的回答有不足之处,否则它可以避免其他人回答。
    • 我同意,这就是为什么没有检查我是否这样做很尴尬。糟糕的形式!
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 2013-12-02
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多