python - 使用 python 正则表达式在有限字符串中查找特定模式
问题描述
我正在学习 Python 正则表达式。我已经阅读了一些资源并观看了一些在线教程,还阅读了这里的一些问答,但我发现它相当具有挑战性。
我正在尝试编写一个re.match()
查找以下简单标准的代码:
- 该字符串的长度必须介于 5 到 15 个字符之间。
- 那些字符必须是
[a-z]
. - 字符串不能有两个或更多相邻的“a”,但它可以有两个或更多相邻的
[b-z]
字符。
匹配和不匹配的示例:
"happy" # Match
"haapy" # Not a match (two adjacent "a's")
"happay" # Match
"happppppppyyyyy # Match (15 characters)
"Happppppyyyyyyyy # Not a match (16 characters)
"happy!" # Not a match (contains "!")
"happy1" # Not a match (contains a number)
问题是,我不确定如何编写一个正则表达式(a)限制字符串可以包含的字符数,并且(b)不允许特定的子字符串模式——在这种情况下,两个或更多相邻的“一”字。
我已经开始了基本模式(见下文)。
^[a-z]{1,32}$
我会考虑消极的前瞻——(?!aa)?我应该如何思考这个问题?感谢您的帮助,如果问题太简单或为时过早,我们深表歉意。
解决方案
我想你已经知道答案了——否定的前瞻!
^((?!aa)[a-z]){5,15}$
测试代码:
import re
strings = [
"happy", # Match
"haapy", # Not a match (two adjacent "a's")
"happay", # Match
"happppppppyyyyy", # Match (15 characters)
"Happppppyyyyyyyy", # Not a match (16 characters)
"happy!", # Not a match (contains "!")
"happy1", # Not a match (contains a number)
"aaaaa",
"bbbaa",
"aabbb",
]
for string in strings:
print('Match!' if re.match('^((?!aa)[a-z]){5,15}$', string) else 'Not a match.')
输出:
Match!
Not a match.
Match!
Match!
Not a match.
Not a match.
Not a match.
Not a match.
Not a match.
Not a match.
我添加了一些案例尾随或标题“aa”。
推荐阅读
- python-3.x - 如何使用python读取JMP文件
- java - 为什么我无法调整 GLWindow 的大小(调整大小的光标甚至不显示)?
- mysql - MySQL 不会在 XAMPP 上启动
- javascript - 优雅的 JSON.parse 异常处理程序
- r - “如果”有两个条件错误
- graph - 按传入顶点对边属性和分组求和
- javascript - 上传时出错,但不是错误
- javascript - 未捕获的类型错误:无法读取未定义的属性“长度” - jQuery
- c++ - 模板参数 SFINAE 不使用模板参数
- android - 为什么 Kotlin 编译器在有效的 IF 语句中给出错误?