正则表达式匹配仅含最多一个换行的空白字符问题
问题解答
当前正则表达式a\s*b无法满足需求。
原因分析
\s在正则中匹配任意空白字符(包括空格、制表符、换行符等),而*表示匹配零次或多次。这意味着a\s*b会允许a和b之间出现任意数量的换行符,比如a\n\nb或a \n\n b这类包含两个及以上换行的字符串也会被匹配,违反了“最多存在一个换行符”的要求。
满足需求的正则表达式
可以使用以下正则实现要求:
r = r"a[\t ]*(?:\n[\t ]*)?b"
规则说明
[\t ]*:匹配任意数量(包括零个)的空格或制表符(?:\n[\t ]*)?:可选分组,匹配一个换行符加上任意数量的空格/制表符,?限制该分组最多出现一次- 整体逻辑:
a之后可接若干空格/制表符,最多跟一组“换行+若干空格/制表符”,最后接b,确保中间最多只有一个换行符,且其余均为空白字符
验证示例
用该正则测试你的案例:
import re r = r"a[\t ]*(?:\n[\t ]*)?b" # 应匹配的情况(输出匹配对象): print(re.match(r, "ab")) print(re.match(r, "a b")) print(re.match(r, "a \n b")) # 不应匹配的情况(输出None): print(re.match(r, "a\n\nb")) print(re.match(r, "a \n\n b"))
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

