繁体   English   中英

如何在python中将字符串中的相同字符更改为不同的值?

[英]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 cycleimap解决方案:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM