【问题标题】:How can I search and replace backticks with <code> </code> tags?如何使用 <code> </code> 标签搜索和替换反引号?
【发布时间】:2020-02-08 16:53:02
【问题描述】:

我有一个大文本文件,其中包含多个由 3 个反引号括起来的文本实例:

    ```
Default:
Publisher Bid Modifier Object with values=[]
    ```

   <td>

    ```
Publisher Bid Modifier Object
    ```

   </td>

我想用&lt;code&gt; &lt;/code&gt;标签替换那些反引号,看起来像这样:

    <code>
Default:
Publisher Bid Modifier Object with values=[]
    </code>

   <td>

    <code>
Publisher Bid Modifier Object
    </code>


   </td>

如何使用 VS Code(或类似工具)之类的文本编辑器进行搜索和替换?我正在使用 MacBook。

非常感谢!

【问题讨论】:

  • 您可以使用 Python 编写程序。你想让我教你怎么做吗?
  • 我以前从未使用过 Python。如果您认为我的启动和运行将相当简单,那么请务必。谢谢!
  • 好的,Python 对于初学者来说是一门很棒的语言,因为它允许用户与他们的代码进行交互,这与其他语言不同。你可以在这里下载最新版本的 Python:python.org/downloads/release/python-374
  • 感谢 AlexS 和 virolino 我可能无法在接下来的一两天内为我提供反馈。但非常感谢您的回复!

标签: regex visual-studio-code sublimetext3 atom-editor


【解决方案1】:

使用正则表达式:

```([^`]*)```

替换成

<code>\1</code>
  • &lt;code&gt;&lt;/code&gt; 只是文本字符串,可以是任何内容;
  • \1 是搜索字符串中的第一个 capture group;此外,您还可以拥有\2\3 ...,具体取决于您搜索的内容;

测试here


但是,让自己成为一项服务,并在替换之前或之后验证“标签”是否正确匹配。捕捉偶数个不匹配是相当棘手的。

【讨论】:

  • 谢谢,virolino 这似乎工作得很好。并且为试驾提供的网站也非常有用。问题:你能解释一下“替代价值”吗?我可以在那里插入什么样的值?
  • 我添加到答案中。
  • 完美!谢谢:)
  • 完成 :)(抱歉 - 我对如何使用 StackOverflow 有点生疏了 :)
【解决方案2】:

我们将使用正则表达式在您的文本文件中查找和替换数据。

正则表达式在某种形式的数据中搜索模式。数据可以是 HTML 文件、word 文件(假设您知道如何提取文本),或者在您的情况下是普通文本文件。要实现正则表达式,您需要使用特殊字符来表示模式的某些特征。 findall 函数采用以下形式:

re.findall(pattern,string)

例如,如果你想在一个文档中找到所有单词“staircase”,你可以写

re.findall("staircase",text)

其中“staircase”是模式,text 是字符串。该程序会将“staircase”的所有实例作为您用作输入的文本中的数组返回。但是,如果您还想包括大写版本的 staircase,即“Staircase”,假设它位于句子的开头,该怎么办?在这种情况下,您使用了我之前提到的特殊字符:您将改为编写以下模式

re.findall("(S|s)taircase",text)

该 |元字符表示左边的内容或右边的内容。还要注意括号是如何用于将项目组合在一起的,这在正则表达式中很常见。因此,正则表达式搜索以下任一字符串:“Staircase”或“staircase”。正则表达式中其他一些重要的元字符是

“\w”匹配任何“word”字符,因此“a”、“b”、“C”和“D”都将匹配这个元字符。

"\W" 匹配任何非单词字符,因此 "1"、"2"、">"、"?" 和 "=" 都将由该元字符匹配。

"\s" 匹配任何空白字符。

"\S" 匹配任何非空白字符。

"\d" 匹配所有数字字符,0-9。

"\D" 匹配任何非数字字符。

除了前面的元字符之外,还有量词 *、+、?、{n}、{min,} 和 {min, max}。以下是这些元字符的简要说明:

“*”匹配前一个元素的零次或多次出现。

“+”匹配前一个元素的一次或多次出现。

“?”匹配前一个元素的零次或一次。

"{n}" 匹配前一个元素的 n 次出现。

"{min,}" 匹配至少 min 次出现的前一个元素。

"{min,max}" 匹配前一个元素的 min 和 max 出现次数(包括 min 和 max)。

举个例子来说明我们到目前为止所介绍的内容,下面是一个使用分组、或符号、量词和元字符的模式示例。

re.findall("(A|a)pple\d*",text)

正则表达式会找到以下所有子字符串:“Apple”、“apple”、“Apple0”、“apple0”、“Apple00”、“apple00”等。

现在我们已经了解了正则表达式的介绍,我们可以继续实际编写代码来使用 Python 解决您的问题。

import re
textFile = open(pathToTextFile,"r")
rawText = textFile.read()
textFile.close()
tags = ["<code>","</code>"]
count = 0
output = ""
for line in rawText.split("\n"):
    if "```" in line:
        output+=re.sub("```",tags[count%2],line)+"\n"
        count+=1
    else:
        output+=line+"/n"
outFile = open(pathToOutFile,"w")
outFile.write(output)
outFile.close()

如果您的计算机上安装了 Python,请打开 IDLE 并创建一个新文件。将打开一个新窗口。这是您编写命令的地方。

我们需要做的第一件事是导入一个名为 re 的包,这是一个用于正则表达式的模块。然后我们加载文本文件(插入您的路径),读取其内容,然后关闭文本文件。

接下来,我们定义一个名为 tags 的数组,其中包含我们将用来替换三个引号的两个标签、一个名为 count 的整数,用于确定要添加的标签,以及一个空输出字符串。

然后我们迭代 rawText 变量的每一新行,每当我们看到三引号时,我们用其中一个标签替换,然后更新 count 变量。否则,我们只需添加该行并移动到 for 循环的下一个元素。

最后,我们创建一个用于写入的新文件(插入您的路径),写入输出字符串,然后关闭文件。我们完成了!输出如下所示。

    <code>
Default:
Publisher Bid Modifier Object with values=[]
    </code>

   <td>

    <code>
Publisher Bid Modifier Object
    </code>

   </td>

参考:https://en.wikipedia.org/wiki/Regular_expression;

【讨论】:

  • 嗨,Alex 非常感谢您的意见。当我本周晚些时候有时间时,我会非常热衷于试驾它。我将 virolino 的答案标记为正确,因为它更接近我的要求 - 即搜索和替换(无需编写代码)。但是非常感谢您的意见(您的方法也是一个可行的选择)。再次感谢皮特
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2017-09-20
  • 2023-02-11
  • 2020-11-26
  • 2018-09-15
  • 2020-06-17
相关资源
最近更新 更多