繁体   English   中英

根据它们所在的位置用两个不同的字符串替换一个子字符串

[英]Replace a substring with two different strings depending on where they are

假设我有一个带星号的字符串:

myvar = "this is an *italicized* substring"

我想更换*italicized*{i}italicized{/i}的项目我的工作,txt2rpy,但我不知道怎么有两个不同的子取决于什么命令他们在被替换。

您可以使用正则表达式来替换整个模式:

re.sub(r'\*(.*?)\*', r'{i}\1{/i}', myvar)

在正则表达式中:

  • \\*匹配文字* (使用两次)
  • (.*?)匹配任意数量的任何(非换行符)字符,尽可能少 - 它也在捕获组中

在替换中:

  • {i}{/i}是文字
  • \\1意味着把什么放在第一个(在这种情况下,只有)捕获组

这给出:

>>> import re
>>> myvar = "this is an *italicized* substring"
>>> print(re.sub(r'\*(.*?)\*', r'{i}\1{/i}', myvar))
this is an {i}italicized{/i} substring

如果模式出现不止一次,这也将起作用:

myvar = "this is an *italicized* substring, and here is *another* one"

会给

this is an {i}italicized{/i} substring, and here is {i}another{/i} one

您可以将re.sub与捕获组一起使用:

import re

txt = "this is an *italicized* substring"

res = re.sub(r"\*([^*]+)\*", "{i}\g<1>{/i}", txt)

将有res为:

this is an {i}italicized{/i} substring

这个模式非常基本:它匹配一个文字* ,然后是字符而不是星号,然后是另一个文字* 这里的要点是我们使用捕获组来捕获单词部分。

然后我们简单地用我们保存的单词(通过\\g<1>访问)替换完整匹配,并用您想要的字符包围。


演示在这里

创建一个用于解析的循环并保持一个计数器进行跟踪,每当计数器保持第二个标签并用第一个标签替换奇数时。

你能不能用一个 for 循环然后说

myvar = "this is an *italicized* substring"
positions = []
for x in range(len(myvar)):
    if myvar[x] == "*":
       positions.append(x)
inAsteriks = myvar[0:positions[0]] + "{i}" + myvar[positions[0]+1:positions[1]] + "{/i}" + myvar[positions[0]+1:]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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