python - 元字符和反斜杠在这里做什么?
问题描述
我正在从某个网站学习正则表达式,但在理解元字符的用法和原始字符串中反斜杠的用法时遇到了一些麻烦。
import re
pattern = r"(.+) \1"
match = re.match(pattern, "word word")
if match:
print ("Match 1")
match = re.match(pattern, "?! ?!")
if match:
print ("Match 2")
match = re.match(pattern, "abc cde")
if match:
print ("Match 3")
我的主要疑问是这里使用 (.+) 和使用的反斜杠。如果不是 1 而是 2,输出会是什么?我知道 + 的意思是“一个或多个重复”。
解决方案
当你这样做时:
r"(.+) \1"
意味着\1
应该与第一组准确捕获的内容相匹配。它不匹配"abc cde"
,因为第一组捕获abc
了,所以就像你匹配这个: re.match(r'abc abc', text)
。这叫回引用一个组。
例如,您需要匹配以相同字母开头的文本:
import re
pattern = r"(\w).+\1"
match = re.match(pattern, "ABA") # OK
match = re.match(pattern, "ABC") # NO
另一个示例以相反的顺序匹配以 3 个字母开头并以此字母结尾的文本
import re
pattern = r"(\w)(\w)(\w)\3\2\1"
re.match(pattern, 'ABCCBA') # OK
re.match(pattern, 'ABCCBC') # NO
注意:您只能反向引用一个捕获组,这意味着这是无效 (?:.+) \1
的,因为第一个组将匹配并且不捕获任何内容,因此您无法反向引用它。
编辑
+
匹配一次或多次,需要至少出现一次*
匹配零次或多次
ca+t
match cat, caat , caaat
:匹配c
后跟至少一个a
或多个后跟t
.
ca+t
match ct, cat , caaaaat
: 匹配c
后跟零个或多个 a
后跟t
推荐阅读
- python - 使用 google auth 库验证 JWT
- ruby-on-rails - 如何在联系表单中添加验证?
- ios - 按标准阻止呼叫 (CallKit)
- javascript - reactjs-popup 没有正确改变状态
- java - 来自一个队列的多个侦听器 RabbitMQ Spring
- delphi - SetThreadDesktop:ERROR_INVALID_HANDLE
- ruby - Ruby 邮件库 如何获取错误报告
- python - Python“如果不存在,那么……”逻辑?
- reporting-services - 封面页上的背景图像在 SSRS 中失真
- numpy - 在python中加速欧几里得距离