用python替换HTML文件中的“*”(asterics)越来越多

时间:2015-10-05 19:15:11

标签: python html replace

我有一个HTML文件,其中包含一系列*(星号),并希望将其替换为从0开始的数字,直到用一个替换所有*(星号)号。

我不确定这在python中是否可行,或者其他方法是否更好。

修改2

以下是我正在处理的TXT文件的简短片段

<td nowrap>4/29/2011 14.42</td>
<td align="center">*</td></tr>

我创建了一个只包含这些行的文件来测试代码。

这是我试图用来改变星号的代码:

number = 0
with open('index.txt', 'r+') as inf:
    text = inf.read()
while "*" in text:
    print "I am in the loop"
    text = text.replace("*", str(number), 1)
    number += 1

我认为这与我可以进行的细节一样多。如果我应该将此编辑添加为另一个评论或将其保留为编辑,请告诉我。 并感谢到目前为止所有的快速反应〜!

5 个答案:

答案 0 :(得分:1)

使用re.sub() function,这允许您使用action -> dispatcher -> store (change state & notify)参数的函数为每个替换生成一个新值:

if (type == 'create' && nlapiGetContext().getRoleCenter() == 'CUSTOMER') {
    if(nlapiGetFieldValue('entity')){// shouldn't be here if no entity
        var hasTerms = nlapiLookupField('customer', nlapiGetFieldValue('entity'), 'terms');
        var neededFormId = hasTerms ? 135 : 134;
        if (req && !req.getParameter('cf') && neededFormId != nlapiGetFieldValue('customform')) {
            nlapiSetRedirectURL('RECORD', nlapiGetRecordType(), nlapiGetRecordId(), (type == 'create'), { cf: neededFormId });
        }
    }
}

计数由itertools.count()处理;每次在这样的对象上调用repl时,都会产生系列中的下一个值:

from itertools import count

with open('index.txt', 'r') as inf:
    text = inf.read()

text = re.sub(r'\*', lambda m, c=count(): str(next(c)), text)

with open('index.txt', 'w') as outf:
    outf.write(text)

Huapito的方法也会起作用,虽然很慢,只要限制替换次数并实际存储替换结果:

next()

注意>>> import re >>> from itertools import count >>> sample = '''\ ... foo*bar ... bar**foo ... *hello*world ... ''' >>> print(re.sub(r'\*', lambda m, c=count(): str(next(c)), sample)) foo0bar bar12foo 3hello4world 的第三个参数;告诉该方法只替换该字符的第一个实例。

答案 1 :(得分:0)

html = 'some string containing html'
new_html = list(html)

count = 0
for char in range(0, len(new_html)):
   if new_html[char] == '*':
       new_html[char] = count
       count += 1

new_html = ''.join(new_html)

这将按顺序将每个星号替换为比星号数小1到1的数字。

答案 2 :(得分:0)

您需要遍历每个字符,您可以写入tempfile,然后使用shutil.move使用itertools.count替换原始文件,以便在每次找到星号时逐步指定一个数字:

from tempfile import NamedTemporaryFile
from shutil import move
from itertools import count
cn = count()

with open("in.html") as f, NamedTemporaryFile("w+",dir="",delete=False) as out:
    out.writelines((ch if ch != "*" else str(next(cn)) 
                    for line in f for ch in line ))

move(out.name,"in.html")

使用测试文件:

foo*bar
bar**foo
*hello*world

将输出:

foo1bar
bar23foo
4hello5world

答案 3 :(得分:-1)

有可能。看看docs。你应该使用&#39; while&#39;循环和&#39;替换&#39; 例如:

number=0 # the first number
while "*" in text: #repeats the following code until this is false
    text = text.replace("*", str(number), maxreplace=1) # replace with 'number'
    number+=1 #increase number

答案 4 :(得分:-2)

使用fileinput

import fileinput

with fileinput.FileInput(fileToSearch, inplace=True) as file:
number=0
for line in file:
    print(line.replace("*", str(number))
    number+=1