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',字符串不变。我很困惑为什么,请帮助。
findall
和 sub
的工作方式不同。根据 the docs,re.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
替换为空字符串。
我的代码:
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',字符串不变。我很困惑为什么,请帮助。
findall
和 sub
的工作方式不同。根据 the docs,re.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
替换为空字符串。