首页 > 解决方案 > 使用 python 正则表达式在有限字符串中查找特定模式

问题描述

我正在学习 Python 正则表达式。我已经阅读了一些资源并观看了一些在线教程,还阅读了这里的一些问答,但我发现它相当具有挑战性。

我正在尝试编写一个re.match()查找以下简单标准的代码:

匹配和不匹配的示例:

"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)?我应该如何思考这个问题?感谢您的帮助,如果问题太简单或为时过早,我们深表歉意。

标签: python

解决方案


我想你已经知道答案了——否定的前瞻! ^((?!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”。


推荐阅读