¥
立即购买

Python正则表达式生成器

0 浏览
0 试用
0 购买
Dec 10, 2025更新

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

# -*- 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)。

示例详情

解决的问题

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

适用用户

Python后端工程师

快速搭建注册登录与后台表单校验、服务入参过滤、日志字段提取,随文档一键集成,提高上线效率。

数据分析师

批量清洗脏数据,提取订单号、时间、品类等关键字段,生成可复用脚本与用例,保障分析口径一致与可追溯。

测试工程师(QA)

依据需求自动产出正则与边界用例,覆盖异常格式,快速搭建校验脚本,降低回归成本并提升缺陷发现率。

特征总结

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

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 524 tokens
- 3 个可调节参数
{ 模式描述 } { 输出语言 } { 匹配场景 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

半价获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59