如何编写满足多约束条件的正则表达式匹配模式?
解决正则表达式中“至少包含两个0”的匹配问题
你已经搞定了开头、结尾和允许字符的规则,唯独卡在了至少两个0的条件上。别担心,我们用正则的正向先行断言就能轻松解决这个问题。
问题分析
你的原正则[02aQ][a-zA-Z0-9$]+[Sd]确实满足了开头、结尾和字符范围的要求,但它完全没限制0的出现次数——哪怕匹配的字符串里只有一个0甚至没有0,都会被错误捞出来。
修改后的正则表达式
我们需要在正则开头加入一个正向先行断言,强制要求整个匹配的字符串中至少包含两个0:
date_pattern = re.compile(r'[02aQ](?=.*0.*0)[a-zA-Z0-9$]*[Sd]')
各部分详细解释
[02aQ]:确保字符串以0、2、a、Q中的任意一个字符开头(?=.*0.*0):正向先行断言,意思是“从当前位置开始,后面的内容里至少能找到两个0”——.*会匹配任意数量的允许字符,所以两个0可以出现在字符串的任何位置[a-zA-Z0-9$]*:匹配中间的任意允许字符(字母、数字、$),用*而非+是因为如果开头是0,结尾是S/d,中间只需要再有一个0就能满足条件,不需要额外字符[Sd]:确保字符串以S或d结尾
完整修改后的代码
import re data = ''' Hello everyone, good evening, I am kanchon and I am from RUET. Now I am writing my assignment for automata code and trying to solve out this problem. Some dummy content line is following: 022jdshjgh$dgdg Quite$stupid this is enough ''' date_pattern = re.compile(r'[02aQ](?=.*0.*0)[a-zA-Z0-9$]*[Sd]') dates = date_pattern.findall(data) print(dates)
测试说明
比如如果你的数据里有0a0$d或者Q120$0S这类包含至少两个0的字符串,都会被正确匹配;而像022jdshjgh$dgdg(只有一个0)这样的内容会被过滤掉,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Kanchon Gharami
相关产品推荐
相关产品推荐

