需要最优的正则表达式代码来消除重复的句子。

huangapple go评论79阅读模式
英文:

Need optimal regex code to eliminate repeat sentences

问题

我想出了这段代码,可以匹配前三句的重复。 (通过重复模式,可以扩展到任意最大重复句数。)

Example usage:

```py
string = '红苹果。 绿辣椒。 黄洋葱。 红苹果。 绿辣椒。 黄洋葱。'
output = re.sub(r'(.*?\.)( .*?\.)?( .*?\.)? ??', r'', string , flags=re.MULTILINE)
print(output)  # '红苹果。 绿辣椒。 黄洋葱。'

示例: Demo: '红苹果。 绿辣椒。 黄洋葱。 红苹果。 绿辣椒。 黄洋葱。'

这也适用于匹配一到两句的重复。

示例: Demo: '红苹果。 红苹果。' -> 输出 '红苹果。'

示例: Demo: '红苹果。 绿辣椒。 红苹果。 绿辣椒。' -> 输出 '红苹果。 绿辣椒。'

你能提供一个优雅/通用的形式,使其能匹配任意数量的重复句子吗?

谢谢。


<details>
<summary>英文:</summary>

I&#39;ve come up with this code that matches up to a repeat of the three prior sentences. (It can be extended to any maximum number of repeat sentences by repeating the pattern.)

```none
(.*?\.)( .*?\.)?( .*?\.)? ??

Example usage:

string = &#39;Red apple. Green pepper. Yellow onion. Red apple. Green pepper. Yellow onion.&#39;
output = re.sub(r&#39;(.*?\.)( .*?\.)?( .*?\.)? ??&#39;, r&#39;&#39;, string , flags=re.MULTILINE)
print(output)  # &#39;Red apple. Green pepper. Yellow onion.&#39;

eg. Demo: &#39;Red apple. Green pepper. Yellow onion. Red apple. Green pepper. Yellow onion.&#39;

It works to match the repeat of one or two sentences too.

eg. Demo: &#39;Red apple. Red apple.&#39; -> Outputs &#39;Red apple.&#39;

eg. Demo: &#39;Red apple. Green pepper. Red apple. Green pepper.&#39; -> Outputs &#39;Red apple. Green pepper.&#39;

Can you suggest an elegant/general form for making it match any nuber of repeat sentences?

Thank you.

答案1

得分: 1

将字符串分割成句子并打印为集合:

import re
string = '红苹果。绿辣椒。黄洋葱。红苹果。绿辣椒。黄洋葱。'
print(set(re.split('。 *', string)))

输出:

{'', '黄洋葱', '红苹果', '绿辣椒'}

是的,结果中没有句点。由于我们知道每个句子原本以句点结尾,所以很容易添加一个。

另外,也可以完全不使用正则表达式:

string = '红苹果。绿辣椒。黄洋葱。红苹果。绿辣椒。黄洋葱。'
print(set(string.replace('。 ', '。').split('。')[:-1]))

输出:

{'黄洋葱', '绿辣椒', '红苹果'}
英文:

Split the string into sentences and print it as a set:

import re
string = &#39;Red apple. Green pepper. Yellow onion. Red apple. Green pepper. Yellow onion.&#39;
print( set( re.split(&#39;\. *&#39;, string)))

Output:

{&#39;&#39;, &#39;Green pepper&#39;, &#39;Red apple&#39;, &#39;Yellow onion&#39;}

Yes, the result loses the period. Since we know each sentence ended with a period originally, it's pretty easy to add one.

Alternatively, without using regular expressions at all:

string = &#39;Red apple. Green pepper. Yellow onion. Red apple. Green pepper. Yellow onion.&#39;
print( set( string.replace(&#39;. &#39;,&#39;.&#39;).split(&#39;.&#39;)[:-1]))

Output:

{&#39;Yellow onion&#39;, &#39;Green pepper&#39;, &#39;Red apple&#39;}

huangapple
  • 本文由 发表于 2023年5月10日 12:12:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/76214834.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定