python - 查找以“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'时更加困惑。
解决方案
匹配行尾或整个文本的$
结尾(取决于标志设置,此处:仅文本结尾)。在“ing”之后立即使用它会强制“ing”必须出现在末尾。
原始字符串表示法允许转义字符,例如\b
通过底层函数(此处:)findall
进行进一步处理(此处:作为单词边界的特殊正则表达式代码)。
没有原始字符串表示法,\b
是 BACKSPACE 控制代码(十六进制0x08
)。该字符由正则表达式引擎处理为自身的简单匹配。
使用[A-z]
匹配所有字母也是不对的。它实际上意味着匹配 Unicode 表中A
和之间的任何字符z
。正如您在此处看到的,这包括例如[
和。如果您只想要 ASCII 字母,请改用。如果您想要所有 Unicode 单词字符(任何支持的语言和下划线的字母和数字),请使用.^
\
[A-Za-z]
\w
要使用正则表达式,例如https://regex101.com/
推荐阅读
- python - 自定义 Tqdm ThreadPoolExecutor
- validation - 如何验证 FLASK WTFORMS 中的布尔字段
- python-3.x - Python:如何将数据写入已打开的 excel 文件(未指定路径)?
- database - 我可以从 Liquibase LoadUpdateData XML 标记中跳过主键子句吗
- html - 为什么我的网站在某些手机上可以正确呈现,而在其他手机上却不能,使用相同的浏览器?
- python - Nvidia 驱动程序的 Docker 和 pygame 显示问题
- pandas - 2 Pandas - 查找不匹配的行并删除不匹配小时的额外行
- rubymine - 如何在 RubyMine 中禁用某些 Rubocop 检查
- flutter - Flutter/ 3 Rows in one Container 或 AlertDialog
- python-3.x - 是否可以接受输入并通过字符串运行它并以我的方式打印它?