我有一个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
我认为这与我可以进行的细节一样多。如果我应该将此编辑添加为另一个评论或将其保留为编辑,请告诉我。 并感谢到目前为止所有的快速反应〜!
答案 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)
import fileinput
with fileinput.FileInput(fileToSearch, inplace=True) as file:
number=0
for line in file:
print(line.replace("*", str(number))
number+=1