正则表达式验证:检测单个未配对双引号及点的合法格式
解决方案
要同时满足「双引号必须成对」和「所有点都在双引号内」的验证需求,可以用两种思路实现:
方法一:直观的分步检测
先检查双引号是否成对,再验证所有点都处于成对的双引号内部:
import re def is_valid(s): # 1. 检查双引号数量是否为偶数(成对) quote_num = len(re.findall(r'"', s)) if quote_num % 2 != 0: return False # 2. 移除所有成对引号内的内容,检查剩余部分是否含未被包裹的点 stripped_content = re.sub(r'"[^"]*"', '', s) if '.' in stripped_content: return False return True
测试示例
# 合法案例 print(is_valid('Don "B." White')) # True print(is_valid('Don "M.dom" White')) # True print(is_valid('Don "B." White "H." Joe')) # True # 非法案例 print(is_valid('Don "B. White')) # False(引号未配对) print(is_valid('Don "B." White "H Simpson')) # False(引号未配对) print(is_valid('Don B. White')) # False(点未被引号包裹)
方法二:单正则全匹配
用一个正则表达式匹配完全合法的字符串,不匹配则说明存在问题:
import re def is_valid(s): pattern = r'^(?:"[^"]*"|[^".])*$' return re.fullmatch(pattern, s) is not None
正则说明
^和$:锁定字符串首尾,确保整个内容都符合规则(?:"[^"]*"|[^".])*:重复匹配两种合法片段:"[^"]*":成对的双引号及其内部内容(允许包含点)[^".]:非双引号、非点的普通字符
如果字符串存在未配对的引号,或者有不在引号内的点,都会无法匹配该正则。
内容的提问来源于stack exchange,提问作者HappyChappy
相关产品推荐
相关产品推荐

