Python中正则表达式怎么用 Python中正则表达式指南

Python中正则表达式通过re模块实现,核心函数包括re.search、re.match、re.findall、re.sub和re.compile,配合原始字符串r""避免转义问题,可高效处理文本匹配、查找、替换与分割。

Python中正则表达式的使用,核心在于利用其内置的

re

模块来定义和应用模式,对字符串进行高效的查找、匹配、替换或分割。它提供了一套强大的语法规则,让你能以极具弹性的方式处理文本数据,远超简单的字符串查找方法。

解决方案

在Python里,正则表达式的一切都围绕着

re

模块展开。你需要做的就是导入它,然后用它的各种函数来操作你的字符串。

最基础的几个函数包括:

  • re.search(pattern, string, flags=0)

    : 在整个字符串中查找第一个匹配项。如果找到,返回一个

    MatchObject

    ;否则返回

    None

    import re
    text = "我的电话是138-0000-1234,工作电话是010-8765-4321。"
    pattern = r"\d{3}-\d{4}-\d{4}" # 匹配手机号格式
    match = re.search(pattern, text)
    if match:
        print(f"找到的手机号: {match.group()}") # 输出:找到的手机号: 138-0000-1234
  • re.match(pattern, string, flags=0)

    : 尝试从字符串的开头匹配模式。只有当模式在字符串开头找到时才返回

    MatchObject

    ,否则返回

    None

    text = "Hello World"
    pattern = r"Hello"
    match = re.match(pattern, text)
    if match:
        print(f"从开头匹配到: {match.group()}") # 输出:从开头匹配到: Hello
    
    pattern_fail = r"World"
    match_fail = re.match(pattern_fail, text)
    if not match_fail:
        print("World不在开头,所以match失败") # 输出:World不在开头,所以match失败
  • re.findall(pattern, string, flags=0)

    : 查找字符串中所有非重叠的匹配项,并以列表形式返回所有匹配的字符串。

    text = "数字123和数字456都在这里。"
    pattern = r"\d+" # 匹配一个或多个数字
    numbers = re.findall(pattern, text)
    print(f"找到的所有数字: {numbers}") # 输出:找到的所有数字: ['123', '456']
  • re.sub(pattern, repl, string, count=0, flags=0)

    : 替换字符串中所有匹配模式的部分。

    repl

    可以是字符串或函数。

    text = "今天是2023年10月26日。"
    pattern = r"\d+"
    new_text = re.sub(pattern, "XXXX", text)
    print(f"替换后的文本: {new_text}") # 输出:替换后的文本: 今天是XXXX年XXXX月XXXX日。
    
    # 使用函数作为替换项
    def replace_func(match_obj):
        return str(int(match_obj.group()) + 1) # 把数字加1
    new_text_func = re.sub(pattern, replace_func, text)
    print(f"函数替换后的文本: {new_text_func}") # 输出:函数替换后的文本: 今天是2024年11月27日。
  • re.compile(pattern, flags=0)

    : 编译正则表达式模式,生成一个

    Pattern

    对象。当模式需要被多次使用时,编译可以提高性能。

    email_pattern = re.compile(r"[\w.-]+@[\w.-]+") # 编译一个简单的邮箱匹配模式
    text_with_emails = "联系我:test@example.com 或 support@domain.org"
    emails = email_pattern.findall(text_with_emails)
    print(f"找到的邮箱: {emails}") # 输出:找到的邮箱: ['test@example.com', 'support@domain.org']

关于原始字符串(Raw String)

r"..."


在Python中,反斜杠

\

是转义字符。而正则表达式里也大量使用

\

来表示特殊序列(如

\d

表示数字)。为了避免Python解释器和正则表达式引擎对

\

的双重转义,我们强烈建议使用原始字符串(

r"..."

)。这样,

r"\d"

就直接被解释为正则表达式中的

\d

,而不是Python中的某个特殊字符。这真的是一个好习惯,能省去不少不必要的麻烦。

Python正则表达式中的元字符和特殊序列有哪些实用技巧?

谈到正则表达式,那些

以上就是Python中正则表达式怎么用 Python中正则表达式指南的详细内容,更多请关注骃骐网【www.myinqi.com】。

相关推荐:

Python类方法定义中必须显式声明self参数

Python类中定义的方法默认会自动接收实例对象作为第一个参数,若方法签名未包含self,调用时就会报“多传入1个位置参数”的错误——本质是Python隐式传入了实例,而函数未声明接收。 python类方法定义中必须显式声明`self`参数 在Python中,**所有实例方法(即定义在类内部、用于操作实例数据的方法)都必须将`self`作为第一个形参**。这不是约定俗成,而是语言强制要求:当通过实...

如何实现Python中线程安全的单例模式_使用元类metaclass或Lock加锁

因为__new__不是原子操作:线程A判断_instance为None后,未执行super().__new__前,线程B也判为None,导致重复创建;GIL不保护跨语句逻辑,需用双重检查锁定(DCL)加threading.Lock确保线程安全。 为什么直接用 __new__ 实现单例在多线程下会失效 因为 __new__ 本身不是原子操作:线程 A 判断 _instance 为 None 后,还没...

Python中如何获取当前正在运行的所有异步任务_使用asyncio.all_tasks函数

asyncio.all_tasks 返回当前事件循环中所有未完成的Task对象集合(set),为空常因未启动事件循环、无活跃循环、任务已完结或跨线程未正确设置循环。 asyncio.all_tasks 返回什么,为什么有时为空 asyncio.all_tasks 返回当前事件循环中所有未完成的 Task 对象集合(set),但它**只作用于当前线程中已运行且未关闭的事件循环**。常见误区是直接调用...

Python怎么实现毫秒级定时任务_基于Apscheduler与Redis后端

APScheduler默认不支持毫秒级调度,因其IntervalTrigger最小单位为秒,传入小于1秒的seconds值会报ValueError;底层依赖time.sleep()和系统轮询,受CPython GIL及操作系统调度延迟影响,实际抖动达10–50ms以上。 为什么 APScheduler 默认不支持毫秒级调度 APScheduler 的 IntervalTrigger 最小单位是秒,...

为什么Python TensorFlow报InvalidArgumentError_通过检查数据类型dtype解决

绝大多数InvalidArgumentError都源于dtype不匹配,应优先检查x.dtype而非仅print(x);修复方法包括tf.cast统一类型、预处理时指定numpy dtype,或根据上下文选择float32/float64。 绝大多数 InvalidArgumentError 都能靠检查 dtype 快速定位,不是“可能”,而是“大概率就是它”。 报错信息里明说 dtype 不匹配...

为什么Python 3.11的异常处理几乎零成本_解析Zero-cost Exception

ExceptionTable是Python 3.11+字节码中存储异常跳转元数据的只读表,它用静态查找替代了3.10及以前依赖SETUP_FINALLY/POP_BLOCK等指令的动态块栈操作,使无异常时几乎零开销——仅保留极轻量的间接寻址,而不再执行任何异常相关字节码。 Python 3.11 的 try/except 在无异常时确实几乎不耗性能,这不是宣传话术,而是字节码层的结构性改变 —— ...

Python怎么使用RabbitMQ的延迟队列?基于Pika库的实现

RabbitMQ延迟队列需通过TTL+死信交换机(DLX)组合实现,精度秒级、延迟时间publish时固定为字符串毫秒值,且必须完整配置x-dead-letter-exchange与x-dead-letter-routing-key,否则消息丢弃。 延迟队列不是RabbitMQ原生功能,得靠TTL+死信交换机组合实现 rabbitmq本身没有x-delayed-message插件以外的内置延迟队列...

Python内置函数有哪些_常用BIF如len/max/min/sum汇总

Python内置函数是类型协议的快捷入口,如len()调用__len__()、max()依赖__iter__()和比较方法,理解此机制可避免参数类型错误与兼容性问题。 Python内置函数不是“功能列表”,而是“类型协议的快捷入口” Python的内置函数(BIF)绝大多数不是独立实现的逻辑,而是对对象__len__、__iter__、__lt__等特殊方法的统一调用封装。比如len(x)实际触发...