@
blueboyggh #17 如果长度要求不是 4 ,而是 8 , `{4,}` 改成 `{8,}` 即可。
`####` 是分割两个字符串的,可以换成其他任意字符串。
`[^,.,。]` 可以把其他要排除的标点符号加进去,比如 !?; 等。
正则表达式里的 `?=\1` 改成 `?:\1` 可能性能会更好一点。
后来想了想,有些情况,提取的不完整。
比如
str1 = "我今天特别开心啊,因为今天是个好日子,我中了 500 万彩票。"
str2 = "今天不是个好日子,因为邻居中了 500 万彩票,我今天不开心,我也想中 500 万彩票。"
只提取了 '是个好日子', '中了 500 万彩票'。
‘ 500 万彩票’ 没有提取出来。
要完整的提取,str1, str2 换个位置,再执行一次,然后两个结果取并集就完整了。
```python
import re
pattern = re.compile(r'([^,.,。]{4,})(?=.*####.*?(?:\1))')
def find_common_subsequences(str1, str2):
result1 = pattern.findall(str1 + "####" + str2)
result2 = pattern.findall(str2 + "####" + str1)
return list(set(result1).union(set(result2)))
# TEST
str1 = "我今天特别开心啊,因为今天是个好日子,我中了 500 万彩票。"
str2 = "今天不是个好日子,因为邻居中了 500 万彩票,我今天不开心,我也想中 500 万彩票。"
result = find_common_subsequences(str1, str2)
print(result)
# 输出: ['是个好日子', ' 500 万彩票', '中了 500 万彩票']
```