19 lines
860 B
Python
19 lines
860 B
Python
import re
|
||
|
||
if __name__ == '__main__':
|
||
# 在进行文本匹配的时候,re库使用的是贪心算法,即找最长匹配字符串
|
||
text1 = 'Computer says "no".'
|
||
text2 = 'Computer says "yes" and "no".'
|
||
# 这样的算法在简单的环境中不会出现问题,但如果遇到闭包匹配(最典型的是双引号)就会出现问题
|
||
said = re.compile(r'\"(.*)\"')
|
||
print(said.findall(text1))
|
||
|
||
# 看,这里就输出了距离最长的两个引号中间的内容
|
||
print(said.findall(text2))
|
||
|
||
# 问题就出现在.匹配字符上,默认.*会匹配除了\n以外的所有字符,其中也包括“”
|
||
# 解决方案是强制取消正则的贪心算法,进行最短匹配
|
||
# 技术上我们在.*后界面加一个?来强制取消贪心
|
||
said_shot = re.compile(r'\"(.*?)\"')
|
||
print(said_shot.findall(text2))
|