×
¥
查看详情
🔥 会员专享 文生文 开发

Python正则表达式生成器

👁️ 66 次查看
📅 Dec 10, 2025
💡 核心价值: 本提示词专为Python开发者设计,能够根据用户描述的模式需求,生成精确匹配的正则表达式代码。通过系统化的需求分析和模式诊断,确保生成的表达式既准确又高效,同时提供详细的使用说明和匹配示例,帮助开发者快速理解和使用。适用于数据清洗、文本分析、表单验证等多种开发场景,提升代码编写效率和质量。

🎯 可自定义参数(3个)

模式描述
需要匹配的文本模式详细描述
输出语言
输出结果使用的语言
匹配场景
正则表达式的主要应用场景

🎨 效果示例

# -*- coding: utf-8 -*-
import re

# 规则说明(简述):
# - local:字母/数字/下划线/加号/点,不能以点开头或结尾,且不允许连续点(通过“分段+点分隔”结构保证)
# - domain:1–10 个标签,每个标签 1–63 字符;以字母或数字开头和结尾,中间可含连字符“-”
# - tld:2–10 个英文字母
# - 忽略大小写
#
# 命名分组:local、domain、tld
#
# 注意:domain 分组仅包含 tld 之前的标签部分,不包含 tld 本身(例如 sub-example.domain.io 中,
#       domain 捕获 "sub-example.domain",tld 捕获 "io")

EMAIL_PATTERN = re.compile(r"""
^
(?P<local>
    [A-Za-z0-9_+]+            # 第一段:不允许以点开头
    (?:\.[A-Za-z0-9_+]+)*     # 后续段:由点连接,避免连续点与结尾点
)
@
(?P<domain>
    # 1–10 个标签
    (?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)      # 第一个标签:1–63,首尾字母/数字,中间可含连字符
    (?:\.(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)){0,9}  # 追加 0–9 个
)
\.
(?P<tld>[A-Za-z]{2,10})
$
""", re.IGNORECASE | re.VERBOSE)


def is_valid_email(email: str) -> bool:
    """用于数据验证场景:返回是否为符合规则的邮箱。"""
    return EMAIL_PATTERN.fullmatch(email) is not None


def parse_email(email: str):
    """
    返回命名分组(local、domain、tld),若不匹配返回 None。
    适合在通过 is_valid_email 判定后调用,以安全获取分组。
    """
    m = EMAIL_PATTERN.fullmatch(email)
    return m.groupdict() if m else None


if __name__ == "__main__":
    # 演示:示例地址匹配
    demo = "user.name+tag_1@sub-example.domain.io"
    m = EMAIL_PATTERN.fullmatch(demo)
    print("Demo matched:", bool(m))
    if m:
        print("Groups:", m.groupdict())

    # 基本正确用例
    ok_cases = [
        "user.name+tag_1@sub-example.domain.io",
        "A_b+c@x-1.io",
        "a@a.bc",  # 最短域标签 + 最短 TLD
        "name@very-long-label-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",  # 63 长度的标签(示意)
        # 10 个域标签(不含 tld)
        "u@a.a.a.a.a.a.a.a.a.a.zz",
    ]

    # 错误用例(边界与非法情况)
    bad_cases = [
        ".abc@domain.com",          # local 以点开头
        "abc.@domain.com",          # local 以点结尾
        "a..b@domain.com",          # local 连续两个点
        "user@-host.com",           # 域标签以连字符开头
        "user@host-.com",           # 域标签以连字符结尾
        "user@sub_domain.com",      # 域标签包含下划线(不允许)
        "user@x." + "a"*1,          # 缺少 tld(只有点后 1 字母 TLD 不满足 2–10)
        "user@host.c",              # tld 长度不足 2
        "user@host.comm3",          # tld 含非字母字符
        # 域标签长度 64(超限)
        "user@" + "a"*64 + ".com",
        # 域标签超过 10 个(domain 分组中 11 个标签)
        "u@" + ".".join(["a"]*11) + ".com",
    ]

    for s in ok_cases:
        assert is_valid_email(s), f"Should be valid: {s}"

    for s in bad_cases:
        assert not is_valid_email(s), f"Should be invalid: {s}"

    print("All tests passed.")

详细功能说明

  • local 分组:

    • 允许字符:字母、数字、下划线、加号、点
    • 结构:由一个或多个“段”组成,段之间以单个点分隔
    • 保障:
      • 不以点开头或结尾(因为段与点的组合方式)
      • 不允许连续两个点(因为点只能出现在两个段之间)
  • domain 分组:

    • 由 1–10 个标签构成(不含 tld)
    • 每个标签 1–63 字符,必须以字母或数字开头和结尾,中间可含连字符“-”
    • 不允许下划线或其他非 ASCII 字母数字及“-”
    • 示例 sub-example.domain 中,两个标签为 sub-example 与 domain
  • tld 分组:

    • 仅由字母组成,长度为 2–10
    • 忽略大小写(通过 re.IGNORECASE)
  • 完整匹配:

    • 使用 ^ 与 $ 锚定,并在调用时使用 fullmatch,确保整串为邮箱格式
    • 提供三个命名分组:local、domain、tld,便于后续解析与存储

使用示例与测试用例

  • 演示示例(题中示例)

  • 快速验证

    • is_valid_email("A_b+c@x-1.io") -> True
    • parse_email("A_b+c@x-1.io") -> {'local': 'A_b+c', 'domain': 'x-1', 'tld': 'io'}
  • 边界测试(见代码断言):

    • local 起始/结尾点、连续点 -> 拒绝
    • 域标签起止为连字符 -> 拒绝
    • 域标签含下划线 -> 拒绝
    • 域标签长度 64 -> 拒绝
    • 域标签数量超过 10(不含 tld) -> 拒绝
    • tld 长度不在 2–10 或含数字 -> 拒绝

常见匹配场景说明

  • 数据验证(注册表单、批量导入时的邮箱字段校验)
  • 解析场景:通过 parse_email 提取 local、domain、tld 分组,便于统计与路由策略(如按 tld 做分发)
  • 日志过滤:用于筛选符合域名规范的邮箱地址

性能注意事项

  • 表达式为线性结构,主要由受限量词与固定前缀/结构组成,无回溯爆炸风险
  • 使用非捕获分组 (?:...) 降低开销,仅对需要的部分使用命名分组
  • 建议复用已编译的 EMAIL_PATTERN(如在模块级别定义),避免频繁编译
  • 在高并发校验中,建议先做长度与基本字符过滤(如整体长度、是否包含 @)后再调用正则,以减少无效匹配调用次数
import re
from typing import Optional, Dict

# Regex: match one Nginx access-log line and extract ip, ts, method, path, status, rt_ms
NGINX_LOG_RE = re.compile(r"""
^
(?P<ip>(?:\d{1,3}\.){3}\d{1,3})      # IPv4 address (not range-validated)
\s+-\s+-\s+                          # literal " - - " with spaces
\[
  (?P<ts>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})
\]
\s+
(?P<method>[A-Z]+)                   # HTTP method in uppercase
\s+
(?P<path>\S+)                        # path without spaces
\s+
HTTP/\d\.\d                          # HTTP version like 1.1, 2.0
\s+
(?P<status>\d{3})                    # 3-digit status code
\s+                                  # at least one space after status
(?:.*\s)?                            # optional middle fields (size, referrer, UA, etc.)
(?P<rt_ms>\d+)ms                     # integer response time followed by "ms"
$
""", re.VERBOSE)

def parse_nginx_line(line: str) -> Optional[Dict[str, str]]:
    """
    Parse a single Nginx access-log line.
    Returns a dict with keys: ip, ts, method, path, status, rt_ms, or None if no match.
    """
    m = NGINX_LOG_RE.match(line)
    if not m:
        return None
    return m.groupdict()

Detailed explanation

  • ip: Captures an IPv4 dotted-quad. This pattern does not enforce 0–255 per octet for performance and simplicity.
  • ts: Captures timestamp strictly as "YYYY-MM-DD HH:MM:SS" inside brackets.
  • method: Captures one or more uppercase letters.
  • path: Captures a non-space sequence (no spaces allowed).
  • status: Captures a 3-digit HTTP status.
  • rt_ms: Captures the trailing integer response time immediately followed by "ms".
  • The regex is anchored with ^ and $ to ensure full-line matches and avoid partial matches.
  • After status, the pattern tolerates arbitrary middle fields (bytes, referrer, user-agent, etc.) and extracts the final "ms" token at line end.

Usage examples and tests

def _show(line: str) -> None:
    parsed = parse_nginx_line(line)
    print(("OK", parsed) if parsed else ("NO MATCH", line))

# Positive examples (should match)
pos_lines = [
    "203.0.113.12 - - [2024-08-12 14:23:11] GET /api/v1/items?id=42 HTTP/1.1 200 512 - Mozilla/5.0 18ms",
    "198.51.100.99 - - [2025-01-01 00:00:00] POST /index.html HTTP/1.0 404 1024 \"-\" curl/8.4.0 123ms",
    "192.0.2.5 - - [2024-12-31 23:59:59] HEAD /ping HTTP/1.1 200 18ms",  # no extra middle fields
]

# Negative examples (should not match)
neg_lines = [
    "203.0.113.12 - - [2024/08/12 14:23:11] GET /api/v1 HTTP/1.1 200 18ms",  # wrong timestamp format
    "203.0.113.12 - - [2024-08-12 14:23:11] get /api HTTP/1.1 200 18ms",    # method not uppercase
    "203.0.113.12 - - [2024-08-12 14:23:11] GET /api v1 HTTP/1.1 200 18ms", # space in path
    "203.0.113.12 - - [2024-08-12 14:23:11] GET /api HTTP/1.1 2000 18ms",   # 4-digit status
    "203.0.113.12 - - [2024-08-12 14:23:11] GET /api HTTP/1.1 200 18 ms",   # space between number and ms
    "2001:db8::1 - - [2024-08-12 14:23:11] GET /api HTTP/1.1 200 18ms",     # IPv6 not supported by this pattern
]

for line in pos_lines:
    _show(line)

for line in neg_lines:
    _show(line)

# Minimal assertion checks
assert parse_nginx_line(pos_lines[0]) == {
    'ip': '203.0.113.12',
    'ts': '2024-08-12 14:23:11',
    'method': 'GET',
    'path': '/api/v1/items?id=42',
    'status': '200',
    'rt_ms': '18',
}

assert parse_nginx_line(pos_lines[2]) == {
    'ip': '192.0.2.5',
    'ts': '2024-12-31 23:59:59',
    'method': 'HEAD',
    'path': '/ping',
    'status': '200',
    'rt_ms': '18',
}

assert parse_nginx_line(neg_lines[0]) is None
assert parse_nginx_line(neg_lines[1]) is None
assert parse_nginx_line(neg_lines[2]) is None
assert parse_nginx_line(neg_lines[3]) is None
assert parse_nginx_line(neg_lines[4]) is None
assert parse_nginx_line(neg_lines[5]) is None

Common matching scenarios

  • ETL/streaming extraction: Use the compiled regex to parse each log line and emit a dict with the six fields for downstream processing.
  • Batch parsing: Iterate over a file line by line, calling parse_nginx_line and filtering out None results.
  • Validation: Quickly validate that an input string conforms to the expected log shape before ingestion.

Performance notes

  • The pattern is anchored (^) and ($) to prevent partial matches and reduce backtracking.
  • The only unbounded segment after the status uses a single greedy ".*" before the final whitespace and "rt_ms". This remains linear-time for typical single-line log entries.
  • Octet range validation for IPv4 is intentionally omitted to avoid lengthy alternations. If strict 0–255 validation is required, consider validating the captured ip separately in Python for clarity and performance.
  • Compile the regex once (as shown) and reuse it across lines to avoid recompilation overhead.
import re
from typing import Optional, Dict

# ISO 8601 扩展格式(YYYY-MM-DDTHH:MM:SS),可选毫秒(1–3位),时区必须为 Z 或 ±HH:MM
# 校验要点:
# - 闰年规则(可匹配 2-29):能被400整除,或能被4整除但不能被100整除
# - 月份 01–12;每月天数上限正确;小时 00–23;分秒 00–59
ISO8601_DT_PATTERN = re.compile(
    r"""
^
(?P<date>
  (?:
    # 非闰年的通用日期(含2月1-28)
    (?:\d{4})-
    (?:
      (?:01|03|05|07|08|10|12)-(?:0[1-9]|[12]\d|3[01])   # 31天的月
      |
      (?:04|06|09|11)-(?:0[1-9]|[12]\d|30)               # 30天的月
      |
      (?:02-(?:0[1-9]|1\d|2[0-8]))                       # 2月1-28
    )
    |
    # 闰年专用的 2-29
    (?:
      (?:
        (?:\d{2}(?:0[48]|[2468][048]|[13579][26]))   # 非整百年,后两位 %4==0(不含00)
        |
        (?:[02468][048]|[13579][26])00               # 整百年且 %400==0
      )
      -02-29
    )
  )
)
T
(?P<time>
  (?:[01]\d|2[0-3])      # 小时 00-23
  :
  [0-5]\d                # 分 00-59
  :
  [0-5]\d                # 秒 00-59
)
(?:\.(?P<ms>\d{1,3}))?   # 可选毫秒 1-3 位
(?P<tz>
  Z
  |
  [+\-](?:[01]\d|2[0-3]):[0-5]\d   # 时区 ±HH:MM(此处允许 00:00–23:59)
)
$
""",
    re.VERBOSE,
)

def is_iso8601_dt(s: str) -> bool:
    """格式检查:字符串是否满足指定的 ISO 8601 日期时间格式。"""
    return ISO8601_DT_PATTERN.fullmatch(s) is not None

def parse_iso8601_dt(s: str) -> Optional[Dict[str, Optional[str]]]:
    """
    解析并返回命名分组:
    - date: YYYY-MM-DD
    - time: HH:MM:SS
    - ms:   毫秒数字(1–3位),若无则为 None
    - tz:   时区字符串(Z 或 ±HH:MM)
    未匹配返回 None。
    """
    m = ISO8601_DT_PATTERN.fullmatch(s)
    return m.groupdict() if m else None

详细的功能说明

  • 支持的格式:YYYY-MM-DDTHH:MM:SS[.ms]Z|±HH:MM
  • 严格的范围校验:
    • 年:4位数字(0000–9999 均可匹配;闰年按规则判定)
    • 月:01–12
    • 日:根据不同月份的天数判定;2月在闰年允许29日
    • 时间:小时 00–23,分 00–59,秒 00–59(不支持闰秒 60)
    • 毫秒:可选小数点后 1–3 位数字(仅捕获数字部分为 ms)
    • 时区:必须存在,且为大写 Z 或 ±HH:MM(此处允许 00:00–23:59)
  • 命名分组:
    • date:完整日期部分(YYYY-MM-DD)
    • time:完整时间部分(HH:MM:SS)
    • ms:毫秒数字(若无则为 None)
    • tz:时区(Z 或 ±HH:MM)

使用示例和测试用例

positives = [
    "2023-12-31T23:59:59Z",
    "2020-02-29T00:00:00+08:00",
    "2000-02-29T23:59:59-00:00",   # 世纪闰年
    "1996-02-29T12:30:15Z",        # 普通闰年
    "2024-02-29T00:00:00Z",
    "2023-01-31T00:00:00+00:00",
    "2023-12-31T23:59:59.1Z",      # 1位毫秒
    "2023-12-31T23:59:59.12+14:00",# 2位毫秒
    "2023-12-31T23:59:59.123-05:30"# 3位毫秒
]

negatives = [
    "2021-02-29T00:00:00Z",        # 非闰年 2-29
    "1900-02-29T12:00:00Z",        # 世纪年非闰年
    "2023-04-31T00:00:00Z",        # 4月无31日
    "2023-13-01T00:00:00Z",        # 非法月份
    "2023-00-10T00:00:00Z",        # 非法月份
    "2023-12-00T00:00:00Z",        # 非法日期
    "2023-12-31T24:00:00Z",        # 非法小时
    "2023-12-31T23:60:00Z",        # 非法分钟
    "2023-12-31T23:59:60Z",        # 非法秒(不支持闰秒)
    "2023-12-31T23:59:59.1234Z",   # 毫秒>3位
    "2023-12-31T23:59:59",         # 缺少时区
    "2023-12-31 23:59:59Z",        # 缺少 'T'
    "2023-12-31T23:59:59z",        # 小写 z 不允许
    "2023-12-31T23:59:59+0800",    # 时区缺少冒号
    "2023-12-31T23:59:59+25:00",   # 时区小时越界
    "2023-12-31T23:59:59+23:60",   # 时区分钟越界
]

print("=== 正例测试 ===")
for s in positives:
    assert is_iso8601_dt(s), f"应匹配但未通过:{s}"
    print(s, "->", parse_iso8601_dt(s))

print("\n=== 反例测试 ===")
for s in negatives:
    assert not is_iso8601_dt(s), f"不应匹配但通过了:{s}"
    print(s, "-> 不匹配")

# 单例解析演示
sample = "2020-02-29T00:00:00+08:00"
parts = parse_iso8601_dt(sample)
# parts 示例:
# {
#   'date': '2020-02-29',
#   'time': '00:00:00',
#   'ms':   None,
#   'tz':   '+08:00'
# }
print("\n解析示例:", sample, "->", parts)

常见匹配场景说明

  • API 入参校验:严格验证后端接收的时间戳格式与范围。
  • 日志解析:从日志中提取满足格式的时间,确保日期有效性(含闰年判断)。
  • 数据清洗:对批量文本中的日期时间字段进行格式过滤与字段拆解(date/time/ms/tz)。

性能注意事项

  • 该表达式为锚定匹配(^$)且字段长度固定,分支明确,不存在灾难性回溯风险。
  • 建议使用预编译的模式对象(如 ISO8601_DT_PATTERN)并配合 fullmatch,提高性能与准确性。
  • 如在高并发环境频繁调用,保持 regex 为模块级单例,避免重复编译。
  • 如果只接受特定时区范围,可进一步收紧 tz 的取值范围以减少分支(例如限制到 ±14:00)。

示例详情

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

自然语言描述直达精准正则,一键生成可用Python代码与说明,立刻落地使用。
自动给出测试用例与匹配示例,边界情况覆盖到位,减少线上异常与返工。
针对日志、表单、文本抽取等场景提供现成模板,按需替换即可快速集成。
智能诊断重复与回溯风险,给出更稳更快的写法,避免性能陷阱。
输出多语言说明与注释,团队成员阅读无压力,协作与交接更顺畅。
支持参数化配置与可读命名,后续维护与扩展轻松,不担心正则难以理解。
一并生成使用指南与最佳实践,告别零碎笔记,规范在项目内迅速统一。
可根据场景自动优化匹配策略,减少误判与漏判,提升数据清洗与验证质量。
提供安全建议与高危规则提醒,杜绝不当匹配导致的安全与合规隐患。
输出结构清晰的代码块与注释,复制即用,省去查资料与反复调试时间。

🎯 解决的问题

将自然语言的匹配需求,快速转化为可直接粘贴到项目中的 Python 正则与可运行示例;覆盖数据清洗、日志解析、表单校验、文本抽取等高频场景,显著缩短从需求到上线的周期;自动补齐边界条件与正反例测试,降低误判风险与性能隐患;以统一清晰的结构输出表达式、用途说明、示例和注意事项,便于团队协作与复用;让初中级开发也能稳定产出“专家级”正则,实现效率与质量双提升。

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...