Python正则表达式取反实现及首尾字符不同的匹配方案
正则相关问题解答
问题1:如何在Python的正则表达式中实现取反操作?
Python正则里的取反操作主要有两种常用实现方式:
- 字符组取反:使用
[^...]语法,匹配除括号内指定字符之外的任意单个字符。比如[^abc]会匹配除a、b、c之外的所有字符,注意只有当^在字符组开头时才表示取反,在其他位置就是普通字符。 - 负向环视断言:用于匹配“不满足某条件”的位置,常见类型:
- 负前瞻断言
(?!...):断言当前位置后面不匹配括号内的表达式,比如a(?!b)会匹配后面不是b的a。 - 负后顾断言
(?<!...):断言当前位置前面不匹配括号内的表达式,比如(?<!a)b会匹配前面不是a的b。
- 负前瞻断言
问题2:如何用正则确保匹配的字符串首尾字符互不相同(以字符串abbbbbbbbbbbbbc为例)
以下是一种结合正则匹配与逻辑校验的实现方案:
代码实现
import re def formating(st): if st[0] == st[-1]: return 0 else: return len(st) mask = r"[^a](a{2,}[^a]|[^b]b{2,}[^b]|[^c]c{2,}[^c]|[^d]d{2,}[^d]|[^e]e{2,}[^e]|[^f]f{2,}[^f]|[^g]g{2,}[^g])" with open("24.txt", "r") as file: text = file.read() result_list = re.findall(mask, text) format_res = map(formating, result_list) print(max(format_res))
逻辑说明
- 正则表达式
mask:通过分支结构匹配文本中被非目标字符包裹的连续重复2次及以上的a-g字符,比如[^a]a{2,}[^a]会匹配前后不是a的连续两个及以上的a,以此覆盖a到g的所有情况。 formating函数:对匹配到的子串做首尾校验——若首尾字符相同则返回0(标记为不满足需求),不同则返回子串长度。- 整体流程:读取文件内容后用正则提取符合格式的子串,批量校验后输出满足首尾不同的子串的最大长度。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

