【问题标题】:python re.findall and re.subpython re.findall 和 re.sub
【发布时间】:2021-11-05 15:55:54
【问题描述】:

我的代码:

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')

返回 ['Deportivo'] 和

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

返回 []

然而,

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

返回'Deportivo coruna',字符串不变。我很困惑为什么,请帮忙。

【问题讨论】:

  • Deportivo 是一个先行断言而不是匹配。摆脱?=(....)
  • 这不是一个好主意,因为如果la 出现在deportivo 之前,那么正则表达式就会匹配。
  • 尝试将您的 "" 替换为 sub 中的其他内容 ("---") 以显示正在发生的事情。具体来说,因为这是一个前瞻而不是匹配,它匹配 Deportivo 的开头(尝试在 Deportivo 之前添加一些东西来证明这一点)
  • 谢谢@FrankYellin!成功了
  • @TimPietzcker。是啊,你说得对。有没有一种可以同时处理这两种方式的解决方案?但至少 OP 了解问题所在。

标签: python python-re


【解决方案1】:

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

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

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

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

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

可以解决问题,但该正则表达式无法在 Python 中编译。

因此,您最好的选择可能是分两步完成。首先,检查您的字符串是否不包含la。然后用空字符串替换所有Deportivos。

【讨论】:

  • 感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多