[英]How to change the same characters in a string to different values in python?
我正在尝试实现一个基本的转换程序,根据它们是一对中的第一颗还是第二颗,将恒星更改为<em>
或</em>
,但是无论我做什么,我的程序都会将所有恒星更改为<em>
或</em>
。
line = "*ju*bil*ee*"
star_counter = 0
new_line = line
for character in line:
if character is "*":
star_counter += 1
if star_counter%2 == 0:
new_line = line.replace(character, "</em>")
else:
new_line = line.replace(character, "<em>")
您已经在逐个字符地循环输入字符串,因此只需追加到输出即可(打开/关闭em
标签的切换是可以的)。
line = "*ju*bil*ee*"
expected = "<em>ju</em>bil<em>ee</em>"
star_counter = 0
new_line = ""
for character in line:
if character is "*":
star_counter += 1
if star_counter%2 == 0:
new_line += "</em>"
else:
new_line += "<em>"
else:
new_line += character
assert new_line == expected
使用来自itertools
cycle
和imap
解决方案:
from itertools import cycle, imap
em = iter(cycle(['<em>','</em>']))
def emEm(c):
if c == '*':
return em.next()
else:
return c
line = imap(emEm,"*ju*bil*ee*")
print(''.join(line))
cycle(['<em>','</em>'])
视需要懒惰地重复<em>
和</em>
emEm
为imap实现了emEm
逻辑 imap
对字符串的每个字符执行逻辑 问题:*为奇数时,您会得到格式不正确的html-标签会打开但不会关闭-但您可以事先检查。
new_line = "*ju*bil*ee*"
star_counter = 0
for character in new_line:
if character is "*":
if star_counter == 0:
new_line = new_line.replace(character, "<em>", 1)
star_counter=1
else:
new_line = new_line.replace(character, "</em>", 1)
star_counter = 0
print(new_line)
输出量
<em>ju</em>bil<em>ee</em>
您可以使用正则表达式替换来执行此操作。
import re
new_line = re.sub(r'\*([^*]+)\*', r'<em>\1</em>', line)
正则表达式将两个*
匹配,它们之间有一些非*
字符,使用捕获组捕获中间的文本,然后在结果中的<em>
和</em>
之间替换该捕获组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.