Python:用正则表达式

时间:2016-12-13 21:00:57

标签: python regex string python-2.7 replace

我想用正则表达式替换所有子字符串出现次数。原始句子就像:

mystring = "Carl's house is big. He is asking 1M for that(the house)."

现在假设我有两个我希望加粗的子串。我通过在子字符串的开头和结尾添加**来加粗单词。 2个子串是:

substring1 = "house", so bolded it would be "**house**"
substring2 = "the house", so bolded it would be "**the house**"

最后我想要这样的原始句子:

mystring = "Carl's **house** is big. He is asking 1M for that(**the house**)."

主要的问题是,由于我有几个要替换的子串,它们可以像上面的例子一样重叠。如果我首先分析最长的子串,我得到这个:

Carl's **house** is big. He is asking 1M for that(**the **house****). 

另一方面,如果我先分析最短的子串,我得到了这个:

Carl's **house** is big. He is asking 1M for that(the **house**).

似乎我需要从最长的子串替换为最短的子串,但是我想知道如何在第一次替换中考虑它而在第二次替换中。还记得子串可以在字符串中多次出现。

注意://假设字符串**永远不会出现在原始字符串中,所以我们可以用它来加粗我们的单词

4 个答案:

答案 0 :(得分:2)

您可以一次搜索所有字符串,因此一个字符串是另一个字符串的事实并不重要:

re.sub(r"(house|the house)", r"**\1**", mystring)

答案 1 :(得分:1)

您可以拥有一个未捕获的组,并且需要注释。如果您查看正则表达式(?P<repl>(?:the )?house)(?:the )?部分表示字符串中可能有the,如果存在,请将其包含在匹配中。这样,您可以让re库优化其匹配方式。这是完整的例子

>>> data = "Carl's house is big. He is asking 1M for that(the house)."
>>> re.sub('(?P<repl>(?:the )?house)', '**\g<repl>**', data) 
"Carl's **house** is big. He is asking 1M for that(**the house**)."

注意:\g<repl>用于获取组<repl>匹配的所有字符串

答案 2 :(得分:0)

你可以做两次传球:

首先:从最长到最短,并用以下内容替换:

  • &#39;房子&#39;:&#39; AA_THE_HOUSE&#39;
  • &#39; house&#39;:&#39; BB_HOUSE&#39;

第二:通过替换:

  • &#39; AA_THE_HOUSE&#39;:&#39; <p>&#39;
  • &#39; BB_HOUSE&#39;:&#39; **the house**&#39;

答案 3 :(得分:0)

用一些唯一值替换字符串,然后用**中的原始字符串替换它们,使它们变粗。

例如:

&#39;房子&#39;与&#39; temp_the_house&#39; &#39;的房子&#39;与&#39; temp_house&#39;

然后&#39; temp_house&#39;与&#39; house &#39; &#39; temp_the_house&#39;与房子****&#39;

应该可以正常工作。您可以使用两个列表自动执行此操作。