Python Regex在findall和sub中有不同的结果

2024-09-28 20:15:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用“早午餐”来代替“早午餐”这一作品。我使用的正则表达式可以正确识别事件,但是当我尝试使用回复sub它取代的文本比所识别的要多关于芬德尔. 我使用的正则表达式是:

re.compile(r'(?:^|\.)(?![^.]*saturday)(?![^.]*sunday)(?![^.]*weekend)[^.]*(brunch)',re.IGNORECASE)

字符串是

str = 'Valid only for dine-in January 2 - March 31, 2015. Excludes brunch, happy hour, holidays, and February 13 - 15, 2015.'

我想让它产生:

'Valid only for dine-in January 2 - March 31, 2015. Excludes BRUNCH, happy hour, holidays, and February 13 - 15, 2015.'

步骤如下:

>>> reg.findall(str)
>>> ['brunch']
>>> reg.sub('BRUNCH',str)
>>> Valid only for dine-in January 2 - March 31, 2015BRUNCH, happy hour, holidays, and February 13 - 15, 2015.

编辑:

我使用的最终解决方案是:

re.compile(r'((?:^|\.))(?![^.]*saturday)(?![^.]*sunday)(?![^.]*weekend)([^.]*)(brunch)',re.IGNORECASE)
re.sub('\g<1>\g<2>BRUNCH',str)

Tags: andinreonlyforholidaysmarchhappy
3条回答

通过正则表达式:

(^|\.)(?![^.]*saturday)(?![^.]*sunday)(?![^.]*weekend)([^.]*)brunch

DEMO

\1\2BRUNCH替换匹配的字符

用于re.sub使用

(^|\.)(?![^.]*saturday)(?![^.]*sunday)(?![^.]*weekend)([^.]*)(brunch)

替换为\1\2BRUNCH。参见演示。你知道吗

https://regex101.com/r/eZ0yP4/16

为什么它匹配多于brunch

因为你的正则表达式实际上比早午餐更配

See link on how the regex match

为什么不在findall中显示?

因为您只包装了paranithesis中的brunch

>>> reg = re.compile(r'(?:^|\.)(?![^.]*saturday)(?![^.]*sunday)(?![^.]*weekend)[^.]*(brunch)',re.IGNORECASE)
>>> reg.findall(str)
['brunch']

在把整个([^.]*brunch)包装在纸上之后

>>> reg = re.compile(r'(?:^|\.)(?![^.]*saturday)(?![^.]*sunday)(?![^.]*weekend)([^.]*brunch)',re.IGNORECASE)
>>> reg.findall(str)
[' Excludes brunch']
  • re.findall忽略那些未被捕获的

相关问题 更多 >