python re.findall 和 re.sub

python re.findall and re.sub

我的代码:

import re
print(re.findall(r'(?=(Deportivo))(?!.*\bla\b)','Deportivo coruna'))
print(re.sub(r'(?=(Deportivo))(?!.*\bla\b)','','Deportivo coruna'))

如果字符串中没有 'la',我有兴趣删除 'Deportivo'。

例如:

re.findall(r'(?=(Deportivo))(?!.*\bla\b)','Deportivo coruna')

returns ['Deportivo'] 和

re.findall(r'(?=(Deportivo))(?!.*\bla\b)','Deportivo la coruna')

returns[]

然而,

re.sub(r'(?=(Deportivo))(?!.*\bla\b)','','Deportivo coruna')

returns 'Deportivo coruna',字符串不变。我很困惑为什么,请帮助。

findallsub 的工作方式不同。根据 the docsre.findall() 将 return 捕获组的内容,即使匹配结果本身是空字符串(在您的情况下也是如此,因为正则表达式完全由前瞻性组成断言)。

因此,如果您想要从您的文本中删除 Deportivo 当且仅当它不包含 la 时,您可以使用

re.sub(r'^(?!.*\bla\b)(.*?)Deportivo)',r'','Deportivo coruna')

但是,这只会删除第一次出现的情况,并且更改它并非易事,因为您需要在后向断言中无限重复,Python 不支持。作为记录,

re.sub(r'^(?<!\bla\b.*)Deportivo(?!.*\bla\b)','','Deportivo coruna')

可以解决问题,但正则表达式不会在 Python 中编译。

所以最好的办法可能是分两步完成。首先,检查您的字符串是否不包含 la。然后将所有 Deportivo 替换为空字符串。