我想用正则表达式替换所有子字符串出现次数。原始句子就像:
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**).
似乎我需要从最长的子串替换为最短的子串,但是我想知道如何在第一次替换中考虑它而在第二次替换中。还记得子串可以在字符串中多次出现。
注意://假设字符串**永远不会出现在原始字符串中,所以我们可以用它来加粗我们的单词
答案 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)
你可以做两次传球:
首先:从最长到最短,并用以下内容替换:
第二:通过替换:
<p>
&#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;
应该可以正常工作。您可以使用两个列表自动执行此操作。