首页 > 解决方案 > 查找以“ing”结尾的单词的两种正则表达式模式之间的区别

问题描述

我试图在以下句子中找到以“ing”结尾的单词=“外面下雨时玩户外游戏总是很有趣!”

现在这不是我的问题本身,因为我找到了必要的正则表达式模式来做到这一点 - (r'\b([A-z]+ing)\b')

问题是我无法理解为什么上述工作但不是我在下面尝试的:

re.findall('([A-z]+ing)$',"Playing outdoor games when it's raining outside is always fun!")

即使下面没有返回空列表

re.findall('([A-z]+ing)$','amazing')

回报惊人

所以这个模式可以匹配以“ing”结尾的单个单词,但不能匹配句子中的单词?为什么?

我发现更奇怪的是: re.findall('\b([A-z]+ing)\b',"Playing outdoor games when it's raining outside is always fun!") 不返回匹配项(空列表)。唯一的区别是不使用原始字符串表示法 (r)

我认为'r'符号只有在我们想要逃避反斜杠时才需要。所以在那种情况下: Pattern1 - '\b([Az]+ing)\b'应该匹配播放,下雨等而不是 Pattern2- r'\b([Az]+ing)\b' 我到底理解了什么错?我搜索了很多 Stack Overflow 答案和官方 Python 正则表达式文档,现在我比刚开始使用'r'时更加困惑。

标签: pythonregexstringpython-3.6

解决方案


匹配行尾或整个文本的$结尾(取决于标志设置,此处:仅文本结尾)。在“ing”之后立即使用它会强制“ing”必须出现在末尾。

原始字符串表示法允许转义字符,例如\b通过底层函数(此处:)findall进行进一步处理(此处:作为单词边界的特殊正则表达式代码)。

没有原始字符串表示法,\b是 BACKSPACE 控制代码(十六进制0x08)。该字符由正则表达式引擎处理为自身的简单匹配。

使用[A-z]匹配所有字母也是不对的。它实际上意味着匹配 Unicode 表中A和之间的任何字符z。正如您在此处看到的,这包括例如[和。如果您只想要 ASCII 字母,请改用。如果您想要所有 Unicode 单词字符(任何支持的语言和下划线的字母和数字),请使用.^\[A-Za-z]\w

要使用正则表达式,例如https://regex101.com/


推荐阅读